package com.dacrt.SBIABackend.controler;

import java.net.URI;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Optional;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;

import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.dacrt.SBIABackend.dto.EntryReporteRegulatorioDto;
import com.dacrt.SBIABackend.dto.EvalProcessRequestDto;
import com.dacrt.SBIABackend.dto.EvalprocimpactsActualizarDto;
import com.dacrt.SBIABackend.dto.FilterEvalReporteRegulatorioDto;
import com.dacrt.SBIABackend.dto.IddscDto;
import com.dacrt.SBIABackend.dto.RecordsReporteRegulatorioDto;
import com.dacrt.SBIABackend.dto.RecordsReporteRegulatorioDto2;
import com.dacrt.SBIABackend.dto.RecordsReporteRegulatorioDto3;
import com.dacrt.SBIABackend.dto.ReporteRegulatorioSeleccionarDto;
import com.dacrt.SBIABackend.dto.ReportesRegulatoriosListDto;
import com.dacrt.SBIABackend.dto.RequestersDto2;
import com.dacrt.SBIABackend.dto.RespuestaCantidadDto;
import com.dacrt.SBIABackend.dto.ScaleResponseDto;
import com.dacrt.SBIABackend.dto.StatusDto;
import com.dacrt.SBIABackend.dto.StatusDto2;
import com.dacrt.SBIABackend.dto.TypeReportDto;
import com.dacrt.SBIABackend.dto.TypeUnitDto;
import com.dacrt.SBIABackend.dto.VicepresidenciesListDto;
import com.dacrt.SBIABackend.dto.requestDto.FacilitiesRequestDto;
import com.dacrt.SBIABackend.dto.responseDto.EntryRepRegulatoriosRespondeDto;
import com.dacrt.SBIABackend.dto.responseDto.ReporteRegulatorioRespondeDtoDto;
import com.dacrt.SBIABackend.dto.responseDto.ReporteRegulatorioRespondeDtoDto2;
import com.dacrt.SBIABackend.entity.Evalprocesses;
import com.dacrt.SBIABackend.entity.Evalprocimpacts;
import com.dacrt.SBIABackend.entity.Evalprocreports;
import com.dacrt.SBIABackend.entity.Facilities;
import com.dacrt.SBIABackend.entity.Regreports;
import com.dacrt.SBIABackend.entity.Requesters;
import com.dacrt.SBIABackend.repository.CampaignsRepository;
import com.dacrt.SBIABackend.repository.EvalprocessesRepository;
import com.dacrt.SBIABackend.repository.EvalprocrecordsRepository;
import com.dacrt.SBIABackend.repository.EvalprocreportsRepository;
import com.dacrt.SBIABackend.repository.RegreportsRepository;
import com.dacrt.SBIABackend.repository.RequestersRepository;
import com.dacrt.SBIABackend.security.dto.AuditRequestDto;
import com.dacrt.SBIABackend.security.dto.ParamsDto;
import com.dacrt.SBIABackend.security.dto.ParamsResponseDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesAllDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesDto;
import com.dacrt.SBIABackend.security.dto.RespuestaDto;
import com.dacrt.SBIABackend.security.dto.RespuestaMsgDto;
import com.dacrt.SBIABackend.security.dto.RespuestaValueDto;
import com.dacrt.SBIABackend.security.dto.RoleDto;
import com.dacrt.SBIABackend.security.entity.Params;
import com.dacrt.SBIABackend.security.entity.Roles;
import com.dacrt.SBIABackend.security.entity.Users;
import com.dacrt.SBIABackend.security.repository.AuditRepository;
import com.dacrt.SBIABackend.security.repository.ParamsRepository;
import com.dacrt.SBIABackend.security.repository.RolesPrivilegesRepository;
import com.dacrt.SBIABackend.security.repository.UsersRepository;
import com.dacrt.SBIABackend.security.service.MenuService;
import com.dacrt.SBIABackend.security.service.ParamsService;
import com.dacrt.SBIABackend.security.service.SecurityService;
import com.dacrt.SBIABackend.security.service.UsersService;
import com.dacrt.SBIABackend.service.RegreportsService;
import com.dacrt.SBIABackend.utils.HttpReqRespUtils;

@RestController
@CrossOrigin(origins = "*")
public class ReportesRegulatoriosController {
	@Autowired
	private ParamsRepository paramsRepository;

	@Autowired
	private UsersRepository usersRepository;
	
	@Autowired
	private RequestersRepository requestersRepository;

	@Autowired
	private AuditRepository auditRepository;
	
	@Autowired
	private RegreportsRepository regreportsRepository;

	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;

	@Autowired
	UsersService usersService;

	@Autowired
	ParamsService paramsService;
	
	@Autowired
	RegreportsService regreportsService;

	@Autowired
	SecurityService securityService;

	@Autowired
	MenuService menuService;

	@Autowired
	private JdbcTemplate jdbcTemplate;

	@Value("${var.ambiente}")
	private String urlAmbiente;

	@Value("${spring.datasource.url}")
	private String conexion;

	@Value("${spring.datasource.username}")
	private String userbd;

	@Value("${spring.datasource.password}")
	private String passbd;

	@PersistenceContext
	private EntityManager entityManager;

	@Autowired
	CampaignsRepository campaignsRepository;

	@Autowired
	EvalprocessesRepository evalprocessesRepository;

	@Autowired
	EvalprocreportsRepository evalprocreportsRepository;


	Logger logger = LoggerFactory.getLogger(ReportesRegulatoriosController.class);

	
	
	@DeleteMapping("/regreports/{regreportid}")
	public ResponseEntity<?> borrarRegReports(HttpServletRequest request, @PathVariable("regreportid") final Integer regreportid)
			throws ParseException {
		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		RoleDto detalleRoles;
		PrivilegesAllDto detallePrivilege;
		
		String var = "";
		boolean bloked = false;
		RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
		String sessionid = request.getHeader("Authorization");
		Date fecha = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata = formatter.format(fecha);
		Date fechaDate = formatter.parse(dataFormattata);
		AuditRequestDto auditDto = new AuditRequestDto();
		RespuestaValueDto respuestaValueDto;
		String searchIn = "";


		Optional<Params> deSessDuration = paramsRepository.findByParamname("SESSION_DURATION");
		String SessionDuration = deSessDuration.get().getValue();
		int duracionSession = Integer.parseInt(SessionDuration);
		Date fecha2 = new Date();
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(fecha2); // tuFechaBase es un Date;
		// calendar.add(Calendar.MINUTE, minutosASumar); //minutosASumar es int.
		calendar.add(Calendar.MINUTE, duracionSession); // horasASumar es int.
		// lo que más quieras sumar
		Date ValidThrufechaSalida = calendar.getTime(); // Y ya tienes la fecha sumada.

		if (sessionid == null) {
			respuesta.setMsg("Llamada al servicio malformado");
			estatus=HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		} else {
			sessionid = sessionid.substring(7);
			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);

			if (encontreSessionUsuario.isPresent()) {
				//Eliminar un registro de un usuario. (priv 633)

				String fechaComoCadena;
				   Date FechaReg = encontreSessionUsuario.get().getValidthru(); 
					   //Llamada a la funcion que validad el tiempo de Session, retorna la fecha sumandole el tiempo de session activa, y vacio si no esta activa
					   
					   // fechaComoCadena  = securityService.consultarSessionActiva(FechaReg,fecha2);
					    fechaComoCadena  = securityService.consultarSessionActiva(FechaReg,fecha2,encontreSessionUsuario.get().getId());
					    if (fechaComoCadena=="") {
						   
						   
						   
						    String var2 = "";
							boolean bloked2 = false;
							RespuestaMsgDto respuestaDto2 = new RespuestaMsgDto(var2);
							//respuestaDto.setBlocked(bloked);
							respuestaDto2.setMsg("Sesión expirada o inválida"); 
							return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
						   
					    }
					    
				  Roles roles = encontreSessionUsuario.get().getRolid();
				   int idrol = roles.getId();
				   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 463);
				  // rolisvalid = 3;
				   if (rolisvalid==0) {
					  
					   
						//boolean bloked = false;
						RespuestaMsgDto respuestaPrivDto = new RespuestaMsgDto(var);
						//respuestaDto.setBlocked(bloked);
						respuestaPrivDto.setMsg("No tiene los Privilegios"); 
						return new ResponseEntity(respuestaPrivDto, HttpStatus.FORBIDDEN);
						
				   }
				   
				
				try {
					
					if (regreportsRepository.existsById(regreportid)) {
						
						  Optional<Regreports> uniDelete = regreportsRepository.findById(regreportid);
						 
						
						// Borro el rol boolean existeUsers = ;
						int valor = 0;
						try {
						//usersRepository.deleteusersbyid(userid,fechaDate,valor);	
							regreportsRepository.deleteRegreportsid(regreportid);	
						    respuestaValueDto= new RespuestaValueDto(regreportid);
						    
						    String module = "Reportes Regulatorios";
						     String Descmodule = "Se eliminó el Reporte Regulatorio: " + uniDelete.get().getName() + " con Id: " + uniDelete.get().getId();
						    
					         auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());
					       
					         String singo1 = "(";
					         String singo2 = ")";
					         String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1).concat(encontreSessionUsuario.get().getEmail().concat(singo2));
					         auditDto.setUserref(usryemail);
					         auditDto.setModule(module);
					         auditDto.setDesc(Descmodule);
					         auditDto.setCreatedat(fechaDate);
					 		   usersService.registrarAuditSesion(auditDto); 
						
						
						estatus=HttpStatus.OK;
						return new ResponseEntity(respuestaValueDto, estatus);
						
						} catch (Exception e) {// Error Interno
							respuesta.setMsg("Error interno del servidor -conflicto. ");
							estatus=HttpStatus.CONFLICT;
							return new ResponseEntity(respuesta, estatus);
						} 
					} else {// Registro no encontrado
						respuesta.setMsg("Registro no encontrado");
						estatus=HttpStatus.NOT_FOUND;
						return new ResponseEntity(respuesta, estatus);
						
					}

				} catch (Exception e) {// Error Interno
					// Manejo de excepciones
					respuesta.setMsg("Error interno del servidor");
					estatus=HttpStatus.INTERNAL_SERVER_ERROR;
					return new ResponseEntity(respuesta, estatus);
				} finally {
					if (entityManager != null && entityManager.isOpen()) {
						entityManager.close();
					}
				}
			} else {
				respuesta.setMsg("Sesión expirada o inválida");
				estatus=HttpStatus.UNAUTHORIZED;
				return new ResponseEntity(respuesta, estatus);
				
			}

			
		}
		
	}
	
	
	@PostMapping("/regreports/{regreportid}")
	public ResponseEntity<ParamsResponseDto> RegReportUpsert(HttpServletRequest request,@RequestBody FacilitiesRequestDto datosvp,@PathVariable("regreportid") final Integer regreportid) throws ParseException {
			//@GetMapping("/vicepresidencies/{vicepresidencyid}")
			
			RespuestaValueDto respuestaValueDto;
			RespuestaMsgDto respuesta = new RespuestaMsgDto("");
			HttpStatus estatus = HttpStatus.FORBIDDEN;
			ParamsResponseDto paramsResponseDto = new ParamsResponseDto();
			ParamsDto detalleParams;
			PrivilegesDto detallePrivilege;
		     List<ParamsDto> listasParams = new ArrayList<>();
		     List<PrivilegesDto> listasPrivelege = new ArrayList<>();
		     
			 int idparametro = regreportid;
			 
			 int valor = idparametro;
			 String sessionid = request.getHeader("Authorization");
			  Date fecha = new Date();
			    SimpleDateFormat  formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		        String dataFormattata = formatter.format(fecha);
		        Date fechaDate = formatter.parse(dataFormattata);
		        AuditRequestDto  auditDto=new AuditRequestDto();
		        Optional<Users> encontreSessionUsuario;    	       	  		
			   Date fecha2 = new Date();
			   Calendar calendar = Calendar.getInstance();
		
			 
				if (sessionid==null) {
					String var = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
					//respuestaDto.setBlocked(bloked);
					respuestaDto.setMsg("Llamada al servicio malformado");
					//Error 400
					return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
				} else   {
					 
					   sessionid = sessionid.substring(7);
					   encontreSessionUsuario =usersRepository.getBySessionid(sessionid);
				       String fechaComoCadena;
					   
					   if (encontreSessionUsuario.isPresent()) {
						   
						   Date FechaReg = encontreSessionUsuario.get().getValidthru(); 
	  					   //Llamada a la funcion que validad el tiempo de Session, retorna la fecha sumandole el tiempo de session activa, y vacio si no esta activa
	  					   
	  					  //  fechaComoCadena  = securityService.consultarSessionActiva(FechaReg,fecha2);
	  					   fechaComoCadena  = securityService.consultarSessionActiva(FechaReg,fecha2,encontreSessionUsuario.get().getId());
	  					    if (fechaComoCadena=="") {
	  						   
	  						   
	  						   
	  						   String var = "";
	  							boolean bloked = false;
	  							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
	  							//respuestaDto.setBlocked(bloked);
	  							respuestaDto.setMsg("Sesión expirada o inválida"); 
	  							return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
	  						   
	  					    }
	  					   
						 //Actualiza o Incluye un registro de un usuario. (Si el unitid es 0 se incluye). (priv 111 MOD Y 112 INC)
						   if (idparametro==0) {
							   //el permiso es el 632
							   Roles roles = encontreSessionUsuario.get().getRolid();
							   int idrol = roles.getId();
							   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 462);
							 //  rolisvalid = 3;
							   if (rolisvalid==0) {
								   
								   String var = "";
									boolean bloked = false;
									RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
									//respuestaDto.setBlocked(bloked);
									respuestaDto.setMsg("No tiene los Privilegios"); 
									return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);
								   
							     }
							
							   
						   } else {
						   
						   Roles roles = encontreSessionUsuario.get().getRolid();
						   int idrol = roles.getId();
						   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 461);
						   //rolisvalid = 3;
						   if (rolisvalid==0) {
							   
							   String var = "";
								boolean bloked = false;
								RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
								//respuestaDto.setBlocked(bloked);
								respuestaDto.setMsg("No tiene los Privilegios"); 
								return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);
							   
						     }
						   
                               boolean existeReg = regreportsRepository.existsById(idparametro);
						   
						      if  (!existeReg) {	
							   
							  
							    
							    	String var = "";
							    	RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
									//respuestaDto.setBlocked(bloked);
									respuestaDto.setMsg("Registro No encontrado");
									//Error 400
									return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
							    
						       }
						   } 
						   		
						   
						   //////////////////validando el requester///////////////
						   boolean existeRequester = requestersRepository.existsById(datosvp.getRequester());
						   
						      if  (!existeRequester) {	
							   
							  
							    
							    	String var = "";
							    	RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
									//respuestaDto.setBlocked(bloked);
									respuestaDto.setMsg("Registro No encontrado");
									//Error 400
									return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
							    
						       } else {
						    	    
						    	   Requesters recu = requestersRepository.findById(datosvp.getRequester());
						    	   
						    	   if (recu.getRequestertypepar()==2) {
						    		   
								    	String var = "";
								    	RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
										//respuestaDto.setBlocked(bloked);
										respuestaDto.setMsg("Tipo Entidad No Valido");
										//Error 400
										return new ResponseEntity(respuestaDto, HttpStatus.CONFLICT);
						    		   
						    	   }
						    	   
						    	   
						       }
						   ///////////////////////////////////////////////////////
						   
						   if (idparametro==0) {
							   
	                
	                       
	                       if  (datosvp.getName()!= "" ) {	
							   
							   //boolean existeName = unitsRepository.existsByName(datosUnidad.getName());
	                    	   String Query2 = "SELECT name FROM main.regreports WHERE LOWER(name) = " + "'" + datosvp.getName().toLowerCase() + "'";
	                    	   
							   Long cuantosregistroname = (long) jdbcTemplate.queryForList(Query2).size();
							   
							    if (cuantosregistroname>0) {
							    	String var = "";
							    	RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
									//respuestaDto.setBlocked(bloked);
									respuestaDto.setMsg("Registro Duplicado");
									//Error 40
									return new ResponseEntity(respuestaDto, HttpStatus.CONFLICT);
							    }
						     }						                     						   											
							   
						   }
							   
						       
				
					   
					 } else {
							String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Sesión expirada o inválida");
							//Error 400
							return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
					 }
				}
				
				
			
			try {
				
				
				//Facilities tipofaci2=null;
				Regreports tiporepo2=null;
				//Facilities tipofaci=null;
				Regreports tiporepo=null;
				//Facilities tipofaciNew2=null;
				Regreports tiporepoNew2=null;
				//Optional<Facilities> nuevoinsertado = null;
				Optional<Regreports> nuevoinsertado = null;
				
				String Salida = usersService.verificarCaracteresValidosConRegex(datosvp.getName());
				String Salida1 = usersService.verificarCaracteresValidosConRegex(datosvp.getDsc());
				String Salida2 = usersService.verificarCaracteresValidosConRegex(datosvp.getFrequency());
				String Salida3 = usersService.verificarCaracteresValidosConRegex(datosvp.getPenalty());
				
				  if (Salida=="NOOK" || Salida1=="NOOK" || Salida2=="NOOK" || Salida3=="NOOK") {
					  String var = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						//respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Caracteres no permitidos en la busqueda"); 
						return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
				  }
				
				if (idparametro==0) {
					
					//Facilities tipofaciNew = new Facilities();
					Regreports tiporepoNew = new Regreports();
					
					tiporepoNew.setStatus(datosvp.getStatus());
					tiporepoNew.setModifiedat(fechaDate);
					tiporepoNew.setCreatedat(fechaDate); 
					tiporepoNew.setName(datosvp.getName());
					String idregreporttypepar  = datosvp.getType().toString();
					tiporepoNew.setEvalprocreporttypepar(idregreporttypepar);
					tiporepoNew.setDsc(datosvp.getDsc());
					tiporepoNew.setPenalty(datosvp.getPenalty());
					tiporepoNew.setFrequency(datosvp.getFrequency());
					tiporepoNew.setRequesterid(datosvp.getRequester());
				
					tiporepoNew2=regreportsService.addIdRegreports(tiporepoNew);
					tiporepo2 = tiporepoNew2;
					
			        nuevoinsertado = regreportsRepository.findByName(datosvp.getName());
					int idInsertado =  nuevoinsertado.get().getId();
					int idmensaje = idInsertado;

				    //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
				     String module = "Reportes Regulatorios";
				     //String Descmodule = "Actualización de parametro del Sistema con id: " + parmid  ;
				     String Descmodule = "Se agregó el Reporte Regulatorio: " + datosvp.getName() + " con Id:" + idInsertado ;
				    
			         auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());			        
			         
			         String singo1 = "(";
			         String singo2 = ")";
			         String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1).concat(encontreSessionUsuario.get().getEmail().concat(singo2));
			         auditDto.setUserref(usryemail);
			         auditDto.setModule(module);
			         auditDto.setDesc(Descmodule);
			         auditDto.setCreatedat(fechaDate);
			 		   usersService.registrarAuditSesion(auditDto); 
			 		   
			 		
						respuestaValueDto= new RespuestaValueDto(idmensaje);
						estatus=HttpStatus.OK;
						return new ResponseEntity(respuestaValueDto, estatus); 
		         

				} else {
					
				    	tiporepo = regreportsService.getRegreportsByid(idparametro);
					 
				    	tiporepo.setStatus(datosvp.getStatus());
				    	tiporepo.setModifiedat(fechaDate);
						//tiporepoNew.setName(datosvp.getName());
						String idregreporttypepar  = datosvp.getType().toString();
						tiporepo.setEvalprocreporttypepar(idregreporttypepar);
						tiporepo.setDsc(datosvp.getDsc());
						tiporepo.setPenalty(datosvp.getPenalty());
						tiporepo.setFrequency(datosvp.getFrequency());
						tiporepo.setRequesterid(datosvp.getRequester());			
					

						String vp1 = tiporepo.getName();
						String vp2 = datosvp.getName();
						if (vp1.equals(vp2)){
							String Validausers = "El reporte es el mismo";
					    	
						} else {
					
						 String QueryTotal = "SELECT name FROM main.regreports WHERE LOWER(name) = " + "'" + datosvp.getName().toString().toLowerCase() + "'" ;
						 Long validavp = (long) jdbcTemplate.queryForList(QueryTotal).size();
						 
		                if (validavp>0) {
							
							String var = "";
							//boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Registro Duplicado");
							//Error 400
							return new ResponseEntity(respuestaDto, HttpStatus.CONFLICT);
							
						} else {
							tiporepo.setName(datosvp.getName());
						}
					}																
					
														
			          
						tiporepo2=regreportsService.addIdRegreports(tiporepo);
						
					    //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
					     String module = "Reportes Regulatorios";
					     //String Descmodule = "Actualización de parametro del Sistema con id: " + parmid  ;
					     String Descmodule = "Se actualizó el Reporte Regulatorio: "+ datosvp.getName() + " con Id:" + regreportid ;
					    
				         auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());			        
				         
				         String singo1 = "(";
				         String singo2 = ")";
				         String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1).concat(encontreSessionUsuario.get().getEmail().concat(singo2));
				         auditDto.setUserref(usryemail);
				         auditDto.setModule(module);
				         auditDto.setDesc(Descmodule);
				         auditDto.setCreatedat(fechaDate);
				 		   usersService.registrarAuditSesion(auditDto); 
				 		  //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////	
				 		   int idmensaje = regreportid;
				 		   respuestaValueDto= new RespuestaValueDto(idmensaje);
							estatus=HttpStatus.OK;
							return new ResponseEntity(respuestaValueDto, estatus); 
			         
			      
				      }
			
			} catch (Exception e) {
	            // Manejo de excepciones
				respuesta= new RespuestaMsgDto("Error interno del servidor");
				estatus=HttpStatus.INTERNAL_SERVER_ERROR;            
	        } finally {
				if (entityManager != null && entityManager.isOpen()) {
					entityManager.close();
				}
			}
			
			return new ResponseEntity(respuesta, estatus);
		
		}	
	
	
	@PostMapping("/regreports")
		public ResponseEntity<?> ListReporteRegulatorio(HttpServletRequest request,
				@RequestBody VicepresidenciesListDto filters) throws ParseException {	
		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		Long cuantosregistro = 0L;

		String sessionid = request.getHeader("Authorization");
		Date fecha = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata = formatter.format(fecha);

		String searchIn = "";
		String PenaltyIn = "";
		int statusIn = 0;
		int RequesterIn = 0;
		int assignedIn = -1;
		int typeIn = 0;
		 int idrol;
		String searchModule = "";
		String searchUsr = "";
		String contentIn = "";
		int orderIn = 0;
		int offsetIn = 0;
		int numofrecordsIn = 0;
		int rolisvalid = 0;

		Optional<Params> deSessDuration = paramsRepository.findByParamname("SESSION_DURATION");
		String SessionDuration = deSessDuration.get().getValue();
		int duracionSession = Integer.parseInt(SessionDuration);
		Date fecha2 = new Date();
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(fecha2); // tuFechaBase es un Date;
		// calendar.add(Calendar.MINUTE, minutosASumar); //minutosASumar es int.
		calendar.add(Calendar.MINUTE, duracionSession); // horasASumar es int.
		// lo que más quieras sumar
		Date ValidThrufechaSalida = calendar.getTime(); // Y ya tienes la fecha sumada.
		SimpleDateFormat salida = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 2024-12-23 23:00
		String fechaComoCadena = salida.format(ValidThrufechaSalida);
		System.out.println(fechaComoCadena);

		// Verifico la session
		if (sessionid == null) {
			respuesta.setMsg("Llamada al servicio malformado");
			estatus = HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		} else {
			sessionid = sessionid.substring(7);
			// verifico si la sesión del usuario existe.
			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
			if (encontreSessionUsuario.isPresent()) { // si la sesión del usuario existe
				Date FechaReg = encontreSessionUsuario.get().getValidthru();
				// Llamada a la funcion que validad el tiempo de Session, retorna la fecha
				// sumandole el tiempo de session activa, y vacio si no esta activa
				fechaComoCadena = securityService.consultarSessionActiva(FechaReg, fecha2,
						encontreSessionUsuario.get().getId());

				if (fechaComoCadena == "") {
					RespuestaMsgDto respuestaDto2;
					String var2 = "";
					boolean bloked2 = false;
					respuestaDto2 = new RespuestaMsgDto(var2);
					respuestaDto2.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto2, HttpStatus.UNAUTHORIZED);
				}

				// Obtengo el rol de usuario y verifico si corresponde al privilegio del usuario
				rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 460);
				Roles roles = encontreSessionUsuario.get().getRolid();
				idrol = roles.getId();
				if (rolisvalid == 0) {
					respuesta.setMsg("No tiene los Privilegios");
					estatus = HttpStatus.FORBIDDEN;
					return new ResponseEntity(respuesta, estatus);
				}

				searchIn = filters.getFilters().getSearch();
				
				String Salida = usersService.verificarCaracteresValidosConRegex(searchIn);
				  
				  if (Salida=="NOOK") {
					  String var = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						//respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Caracteres no permitidos en la busqueda"); 
						return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
				  }
				  
				statusIn = filters.getFilters().getStatus();
				RequesterIn = filters.getFilters().getRequesterid();
				//PenaltyIn = filters.getFilters().getPenalty();
				//assignedIn = filters.getFilters().getAssigned();
				typeIn = Integer.parseInt(filters.getFilters().getType());
				//int facitilytype  = Integer.parseInt((String) faci[5]);

				orderIn = filters.getOrder();// Orden Ascedente o Descendente
				offsetIn = filters.getOffset();// Primer registro a mostrar
				numofrecordsIn = filters.getNumofrecords();// Número de registros a mostrar

				if (contentIn != null && contentIn != "") {
					menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());
				}
			

				try {
					Query query;
					Query query2;
					Query query3;
					Query query4;
					String QueryTotal = "";
					String QueryTotal2 = "";
					StatusDto status = new StatusDto();
					ReporteRegulatorioRespondeDtoDto2 entryReporteRegulatorioDto = new ReporteRegulatorioRespondeDtoDto2();
					RecordsReporteRegulatorioDto2 recordsReporteRegulatorioDto = new RecordsReporteRegulatorioDto2();
					List<RecordsReporteRegulatorioDto2> records = new ArrayList();
					RequestersDto2 requester = new RequestersDto2();
					List<Integer> selected = new ArrayList();
					
					String name = "u.name"; // buscar por nombre
					//String status = "u.status"; // buscar por status
					//String lowername = "LOWER(u.name)"; // se convierte en minúscula
					String lowername = "main.sinacentos(LOWER(u.name))";
					String lowerdsc = "main.sinacentos(LOWER(u.dsc))";
					String lowerpenalty = "main.sinacentos(LOWER(u.penalty))";
					String lowerfrequency = "main.sinacentos(LOWER(u.frequency))";
					String LowerSearch = paramsService.quitarAcentosJava(searchIn.toLowerCase()); // se convierte en minúscula
					
					
					StatusDto2 status2 = new StatusDto2();
					// Luego consulto la tabla EvalProcess
					String SentenciaBase = "select u.id,u.name,u.dsc,u.frequency,u.penalty,u.status,CASE WHEN u.status=1 THEN 'Activa' ELSE 'Inactiva' END AS descstatus ,r.id as idrequester,r.name as namerequester,u.evalprocreporttypepar "
							+ "	from main.regreports u "
							+ " left join main.requesters r on r.id = u.requesterid ";
					

					switch (searchIn) {
					case "": 
						switch (statusIn) {
						case 0:
							// viene sin busqueda por el like
							QueryTotal = SentenciaBase + " WHERE 1 = 1 ";
							

							break;
						case 1:
							// viene sin busqueda por el like
							QueryTotal = SentenciaBase + " WHERE " + " u.status " + " = " + 1;
							break;	
						default:
							QueryTotal = SentenciaBase + " WHERE " + " u.status " + " = " + 0;
							break;
						}
						break;
					default: // viene con el parametro para buscar por el like
						switch (statusIn) {
						case 0:
							// viene sin busqueda por el like
							QueryTotal = SentenciaBase + " WHERE 1 = 1 ";
							QueryTotal = QueryTotal + " AND ( " + lowername + " LIKE " + "'%" + LowerSearch + "%'" + " OR " +  lowerdsc + " LIKE " + "'%" + LowerSearch + "%'" + " OR " +  lowerpenalty + " LIKE " + "'%" + LowerSearch + "%'" + " OR " +  lowerfrequency + " LIKE " + "'%" + LowerSearch + "%'"  + ")";
						
							break;
						case 1:
							// viene sin busqueda por el like
							QueryTotal = SentenciaBase + " WHERE " + " u.status " + " =  " + 1;
							QueryTotal = QueryTotal + " AND ( " + lowername + " LIKE " + "'%" + LowerSearch + "%'" + " OR " +  lowerdsc + " LIKE " + "'%" + LowerSearch + "%'" + " OR " +  lowerpenalty + " LIKE " + "'%" + LowerSearch + "%'" + " OR " +  lowerfrequency + " LIKE " + "'%" + LowerSearch + "%'"  + ")";

							break;	
						default:
							QueryTotal = SentenciaBase + " WHERE " + " u.status " + " =  " + 0;
							QueryTotal = QueryTotal + " AND ( " + lowername + " LIKE " + "'%" + LowerSearch + "%'" + " OR " +  lowerdsc + " LIKE " + "'%" + LowerSearch + "%'" + " OR " +  lowerpenalty + " LIKE " + "'%" + LowerSearch + "%'" + " OR " +  lowerfrequency + " LIKE " + "'%" + LowerSearch + "%'"  + ")";

							break;
						}
						break;
				  }

					switch (RequesterIn) {
					case 0:
						QueryTotal = QueryTotal + " AND 1=1 ";
						break;
					default: // viene con el parametro para buscar por el like
						QueryTotal = QueryTotal + " AND  r.id = " + RequesterIn;
						break;
					}
					
					switch (typeIn) {
					case 0:
						QueryTotal = QueryTotal + " AND 1=1 ";
						break;
					default: // viene con el parametro para buscar por el like
						QueryTotal = QueryTotal + " AND  cast(u.evalprocreporttypepar as integer) = " + typeIn;
						break;
					}
					
					/*switch (PenaltyIn) {
					case "":
						QueryTotal = QueryTotal + " AND 1=1 ";
						break;
					default: // viene con el parametro para buscar por el like
						QueryTotal = QueryTotal + " AND  u.penalty = " + PenaltyIn;
						break;
					}*/


					 String ordena="";
					// if (formatList==1) {	 
					     if (orderIn == 1 || orderIn == 2 || orderIn == 3 || orderIn == 4 || orderIn == 5 || orderIn == 6 || orderIn == 99) {
						  ordena = " ASC";
					      }  else if (orderIn == -1 || orderIn == -2 || orderIn == -3 || orderIn == -4 || orderIn == -5 || orderIn == -6 || orderIn == -99) {
						  ordena = " DESC";
					       } else {
						 	String var2 = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
							respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
							estatus=HttpStatus.BAD_REQUEST;   
							return new ResponseEntity(respuestaDto, estatus);
					      }
					// }
					 int absolutoOrden = Math.abs(orderIn);
					 
					 switch (absolutoOrden) { 
					    case 1:  //ordena por dsc ascendente
					    	
					    	QueryTotal = QueryTotal + " ORDER BY " + " u.name " + ordena;
					     break;
					    case 2:   //ordena por status ascendente
					    	
					    	QueryTotal = QueryTotal + " ORDER BY " + " u.status " + ordena;
					     break;
	                    case 3:   //ordena por status ascendente
					    	
					    	QueryTotal = QueryTotal + " ORDER BY " + " u.dsc " + ordena;
					     break;
	                    case 4:   //ordena por status ascendente
		
		                    QueryTotal = QueryTotal + " ORDER BY " + " r.name" + ordena;
	                     break;
	                    case 5:   //ordena por status ascendente
	                		
		                    QueryTotal = QueryTotal + " ORDER BY " + " u.frequency " + ordena;
	                     break;
	                    case 6:   //ordena por status ascendente
	                		
		                    QueryTotal = QueryTotal + " ORDER BY " + " u.penalty " + ordena;
	                     break;
	                    case 99:   //ordena por status ascendente
	                    	
		                    QueryTotal = QueryTotal + " ORDER BY " + " u.id " + ordena;
	                    break;
	                    default:
	                    	String var2 = "";
	                    	boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
							respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
							estatus=HttpStatus.BAD_REQUEST;   
							return new ResponseEntity(respuestaDto, estatus);
					    
					   }
					 
					System.out.println(QueryTotal);
					query = entityManager.createNativeQuery(QueryTotal);
					

					cuantosregistro = (long) query.getResultList().size();
					query.setFirstResult(offsetIn);
					query.setMaxResults(numofrecordsIn);
					List<Object[]> resultados = query.getResultList();

					String QueryType = "SELECT CAST(elem AS TEXT) " + "	FROM main.params pa, "
							+ "	jsonb_array_elements(CAST(pa.value AS jsonb)) AS elem "
							+ "	WHERE pa.paramname = 'REGREPORT_TYPE' ";

					TypeReportDto typeReportDto = new TypeReportDto();
					List<TypeReportDto> typeReportDtoList = new ArrayList();

					query2 = entityManager.createNativeQuery(QueryType);
					List<Object[]> resultadosType = query2.getResultList();
					
					PrivilegesAllDto detallePrivilege = new PrivilegesAllDto();
					  detallePrivilege = new PrivilegesAllDto();
		    	       boolean tieneView = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,460);
					   boolean tieneUpdate = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,461);
					   boolean tieneAdd = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,462);
					   boolean tieneDelete = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,463);
					   //existsByRolidAndPrivilegeid
					   
	   	    	 	    detallePrivilege.setView(tieneView);
			    	  	detallePrivilege.setUpdate(tieneUpdate);		    	  
			    	  	detallePrivilege.setAdd(tieneAdd);
			    	  	detallePrivilege.setDelete(tieneDelete);
			    	  	

					JSONObject jsonObject;
					String jsonStringType = "";
					if (resultadosType.size() > 0) {
						for (Object type : resultadosType) {
							jsonStringType = (String) type; // Recupera el JSON como String
							jsonObject = new JSONObject(jsonStringType); // Convierte String a JSONObject
							// Extrae los valores del JSONObject
							String dsc = jsonObject.getString("dsc");
							String value = jsonObject.getString("value");

							typeReportDto.setDsc(dsc);
							typeReportDto.setValue(value);
							typeReportDtoList.add(typeReportDto);
							typeReportDto = new TypeReportDto();
						}
					}
					
					
					
					Integer filter = 0;
					Integer periodo = 0;
					if (cuantosregistro > 0) {
						for (Object[] fila : resultados) {
							recordsReporteRegulatorioDto.setId((Integer) fila[0]);
							recordsReporteRegulatorioDto.setName((String) fila[1]);
							recordsReporteRegulatorioDto.setDsc((String) fila[2]);
							recordsReporteRegulatorioDto.setFrequency((String) fila[3]);
							recordsReporteRegulatorioDto.setPenalty((String) fila[4]);
							//recordsReporteRegulatorioDto.setSelected((boolean) fila[5]);
							status2.setId((Integer) fila[5]);
							status2.setName((String) fila[6]);
							recordsReporteRegulatorioDto.setStatus(status2);
							
							requester.setId((Integer) fila[7]);
							requester.setName((String) fila[8]);
							recordsReporteRegulatorioDto.setRequester(requester);
							records.add(recordsReporteRegulatorioDto);

							recordsReporteRegulatorioDto = new RecordsReporteRegulatorioDto2();
							requester = new RequestersDto2();
							status2 = new StatusDto2();
						}

						//entryReporteRegulatorioDto.setStatus(status);
						entryReporteRegulatorioDto.setTypes(typeReportDtoList);
						entryReporteRegulatorioDto.setNumofrecords(cuantosregistro);
						entryReporteRegulatorioDto.setRecords(records);
						entryReporteRegulatorioDto.setSessionvalidthru(fechaComoCadena);
						entryReporteRegulatorioDto.setPrivileges(detallePrivilege);
						return new ResponseEntity(entryReporteRegulatorioDto, HttpStatus.OK);
						
					} else {
					
						entryReporteRegulatorioDto.setTypes(typeReportDtoList);
						entryReporteRegulatorioDto.setNumofrecords(cuantosregistro);
						entryReporteRegulatorioDto.setRecords(records);
						entryReporteRegulatorioDto.setSessionvalidthru(fechaComoCadena);
						entryReporteRegulatorioDto.setPrivileges(detallePrivilege);
						return new ResponseEntity(entryReporteRegulatorioDto, HttpStatus.OK);
						
					}

					
				} catch (Exception e) {
					respuesta.setMsg("Error interno del servidor " + e.getMessage());
					estatus = HttpStatus.INTERNAL_SERVER_ERROR;
				} finally {
					if (entityManager != null && entityManager.isOpen()) {
						entityManager.close();
					}
				}
			} else { // Si la sesión que viene es inválida
				respuesta.setMsg("Sesión expirada o inválida");
				estatus = HttpStatus.BAD_REQUEST;
				return new ResponseEntity(respuesta, estatus);
			}
			return new ResponseEntity(respuesta, estatus);
		}
	}
	
	
	@GetMapping("/regreports/{regreportid}")
	public ResponseEntity<?> getOneFacilities(HttpServletRequest request, @PathVariable("regreportid") final Integer regreportid) throws ParseException {	
	RespuestaMsgDto respuesta = new RespuestaMsgDto("");
	HttpStatus estatus = HttpStatus.FORBIDDEN;
	Long cuantosregistro = 0L;

	String sessionid = request.getHeader("Authorization");
	Date fecha = new Date();
	SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	String dataFormattata = formatter.format(fecha);

	String searchIn = "";
	String PenaltyIn = "";
	int statusIn = 0;
	int RequesterIn = 0;
	int assignedIn = -1;
	int typeIn = 0;

	String searchModule = "";
	String searchUsr = "";
	String contentIn = "";
	int orderIn = 0;
	int offsetIn = 0;
	int numofrecordsIn = 0;
	int rolisvalid = 0;

	Optional<Params> deSessDuration = paramsRepository.findByParamname("SESSION_DURATION");
	String SessionDuration = deSessDuration.get().getValue();
	int duracionSession = Integer.parseInt(SessionDuration);
	Date fecha2 = new Date();
	Calendar calendar = Calendar.getInstance();
	calendar.setTime(fecha2); // tuFechaBase es un Date;
	// calendar.add(Calendar.MINUTE, minutosASumar); //minutosASumar es int.
	calendar.add(Calendar.MINUTE, duracionSession); // horasASumar es int.
	// lo que más quieras sumar
	Date ValidThrufechaSalida = calendar.getTime(); // Y ya tienes la fecha sumada.
	SimpleDateFormat salida = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 2024-12-23 23:00
	String fechaComoCadena = salida.format(ValidThrufechaSalida);
	System.out.println(fechaComoCadena);

	// Verifico la session
	if (sessionid == null) {
		respuesta.setMsg("Llamada al servicio malformado");
		estatus = HttpStatus.BAD_REQUEST;
		return new ResponseEntity(respuesta, estatus);
	} else {
		sessionid = sessionid.substring(7);
		// verifico si la sesión del usuario existe.
		Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
		if (encontreSessionUsuario.isPresent()) { // si la sesión del usuario existe
			Date FechaReg = encontreSessionUsuario.get().getValidthru();
			// Llamada a la funcion que validad el tiempo de Session, retorna la fecha
			// sumandole el tiempo de session activa, y vacio si no esta activa
			fechaComoCadena = securityService.consultarSessionActiva(FechaReg, fecha2,
					encontreSessionUsuario.get().getId());

			if (fechaComoCadena == "") {
				RespuestaMsgDto respuestaDto2;
				String var2 = "";
				boolean bloked2 = false;
				respuestaDto2 = new RespuestaMsgDto(var2);
				respuestaDto2.setMsg("Sesión expirada o inválida");
				return new ResponseEntity(respuestaDto2, HttpStatus.UNAUTHORIZED);
			}

			// Obtengo el rol de usuario y verifico si corresponde al privilegio del usuario
			rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 460);
			if (rolisvalid == 0) {
				respuesta.setMsg("No tiene los Privilegios");
				estatus = HttpStatus.FORBIDDEN;
				return new ResponseEntity(respuesta, estatus);
			}

			

			try {
				Query query;
				Query query2;
				Query query3;
				Query query4;
				String QueryTotal = "";
				String QueryTotal2 = "";
				StatusDto status = new StatusDto();
				EntryRepRegulatoriosRespondeDto entryReporteRegulatorioDto = new EntryRepRegulatoriosRespondeDto();
				RecordsReporteRegulatorioDto3 recordsReporteRegulatorioDto = new RecordsReporteRegulatorioDto3();
				List<RecordsReporteRegulatorioDto> records = new ArrayList();
				RequestersDto2 requester = new RequestersDto2();
				List<Integer> selected = new ArrayList();
				
				String name = "u.name"; // buscar por nombre
				//String status = "u.status"; // buscar por status
				//String lowername = "LOWER(u.name)"; // se convierte en minúscula
				String lowername = "main.sinacentos(LOWER(u.name))";
				String lowerdsc = "main.sinacentos(LOWER(u.dsc))";
				String lowerpenalty = "main.sinacentos(LOWER(u.penalty))";
				String lowerfrequency = "main.sinacentos(LOWER(u.frequency))";
				String LowerSearch = paramsService.quitarAcentosJava(searchIn.toLowerCase()); // se convierte en minúscula
				
				
				boolean existeReporte  =  regreportsRepository.existsById(regreportid);
				
				if (!existeReporte) {
					respuesta.setMsg("Registro no encontrado.");
					estatus = HttpStatus.NOT_FOUND;
					return new ResponseEntity(respuesta, estatus);
				}
				
				
				StatusDto2 status2 = new StatusDto2();
				IddscDto type2 = new IddscDto();
				// Luego consulto la tabla EvalProcess
				String SentenciaBase = "select u.id,u.name,u.dsc,u.frequency,u.penalty,u.status,CASE WHEN u.status=1 THEN 'Activa' ELSE 'Inactiva' END AS descstatus ,r.id as idrequester,r.name as namerequester,cast(u.evalprocreporttypepar as integer),pr.descr AS descrtype "
						+ "	from main.regreports u "
						+ " left join main.requesters r on r.id = u.requesterid "
						+ "  LEFT JOIN ( SELECT elemento ->> 'dsc' AS descr,elemento ->> 'value' AS valor  "
						+ "     	FROM main.params p,  "
						+ "		jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento  "
						+ "    WHERE p.paramname = 'REGREPORT_TYPE') pr ON u.evalprocreporttypepar = pr.valor "
						+ " WHERE u.id = " + regreportid;
				

	
				System.out.println(SentenciaBase);
				query = entityManager.createNativeQuery(SentenciaBase);
				

				cuantosregistro = (long) query.getResultList().size();
				//query.setFirstResult(offsetIn);
				//query.setMaxResults(numofrecordsIn);
				List<Object[]> resultados = query.getResultList();

				String QueryType = "SELECT CAST(elem AS TEXT) " + "	FROM main.params pa, "
						+ "	jsonb_array_elements(CAST(pa.value AS jsonb)) AS elem "
						+ "	WHERE pa.paramname = 'REGREPORT_TYPE' ";

				TypeReportDto typeReportDto = new TypeReportDto();
				List<TypeReportDto> typeReportDtoList = new ArrayList();

				query2 = entityManager.createNativeQuery(QueryType);
				List<Object[]> resultadosType = query2.getResultList();

				JSONObject jsonObject;
				String jsonStringType = "";
				if (resultadosType.size() > 0) {
					for (Object type : resultadosType) {
						jsonStringType = (String) type; // Recupera el JSON como String
						jsonObject = new JSONObject(jsonStringType); // Convierte String a JSONObject
						// Extrae los valores del JSONObject
						String dsc = jsonObject.getString("dsc");
						String value = jsonObject.getString("value");

						typeReportDto.setDsc(dsc);
						typeReportDto.setValue(value);
						typeReportDtoList.add(typeReportDto);
						typeReportDto = new TypeReportDto();
					}
				}
				
				
				
				Integer filter = 0;
				Integer periodo = 0;
				if (cuantosregistro > 0) {
					for (Object[] fila : resultados) {
						recordsReporteRegulatorioDto = new RecordsReporteRegulatorioDto3();
						requester = new RequestersDto2();
						status2 = new StatusDto2();
						type2 = new IddscDto();
						
						recordsReporteRegulatorioDto.setId((Integer) fila[0]);
						recordsReporteRegulatorioDto.setName((String) fila[1]);
						recordsReporteRegulatorioDto.setDsc((String) fila[2]);
						recordsReporteRegulatorioDto.setFrequency((String) fila[3]);
						recordsReporteRegulatorioDto.setPenalty((String) fila[4]);
						
						//seteando el type
						type2.setId((Integer) fila[9]);
						type2.setDsc((String) fila[10]);
						recordsReporteRegulatorioDto.setType(type2);
						
						//recordsReporteRegulatorioDto.setSelected((boolean) fila[5]);
						status2.setId((Integer) fila[5]);
						status2.setName((String) fila[6]);
						recordsReporteRegulatorioDto.setStatus(status2);
						
						requester.setId((Integer) fila[7]);
						requester.setName((String) fila[8]);
						recordsReporteRegulatorioDto.setRequester(requester);
						//records.add(recordsReporteRegulatorioDto);

						
					}

					//entryReporteRegulatorioDto.setStatus(status);
					entryReporteRegulatorioDto.setTypes(typeReportDtoList);
					entryReporteRegulatorioDto.setEntry(recordsReporteRegulatorioDto);
					return new ResponseEntity(entryReporteRegulatorioDto, HttpStatus.OK);
					
				} else {
				
					entryReporteRegulatorioDto.setTypes(typeReportDtoList);
					entryReporteRegulatorioDto.setEntry(recordsReporteRegulatorioDto);
					return new ResponseEntity(entryReporteRegulatorioDto, HttpStatus.OK);
					
				}

				
			} catch (Exception e) {
				respuesta.setMsg("Error interno del servidor " + e.getMessage());
				estatus = HttpStatus.INTERNAL_SERVER_ERROR;
			} finally {
				if (entityManager != null && entityManager.isOpen()) {
					entityManager.close();
				}
			}
		} else { // Si la sesión que viene es inválida
			respuesta.setMsg("Sesión expirada o inválida");
			estatus = HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		}
		return new ResponseEntity(respuesta, estatus);
	}
}
	
	@PostMapping({ "/evalprocesses/{evalprocessid}/reports" })
	public ResponseEntity<EntryReporteRegulatorioDto> ObtenerUnReporteRegulatorio(HttpServletRequest request,
			@RequestBody ReportesRegulatoriosListDto filters,
			@PathVariable("evalprocessid") final Integer evalprocessid) throws ParseException {
		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		Long cuantosregistro = 0L;

		String sessionid = request.getHeader("Authorization");
		Date fecha = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata = formatter.format(fecha);

		String searchIn = "";
		int assignedIn = -1;
		int typeIn = 0;

		String searchModule = "";
		String searchUsr = "";
		String contentIn = "";
		int orderIn = 0;
		int offsetIn = 0;
		int numofrecordsIn = 0;
		int rolisvalid = 0;

		Optional<Params> deSessDuration = paramsRepository.findByParamname("SESSION_DURATION");
		String SessionDuration = deSessDuration.get().getValue();
		int duracionSession = Integer.parseInt(SessionDuration);
		Date fecha2 = new Date();
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(fecha2); // tuFechaBase es un Date;
		// calendar.add(Calendar.MINUTE, minutosASumar); //minutosASumar es int.
		calendar.add(Calendar.MINUTE, duracionSession); // horasASumar es int.
		// lo que más quieras sumar
		Date ValidThrufechaSalida = calendar.getTime(); // Y ya tienes la fecha sumada.
		SimpleDateFormat salida = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 2024-12-23 23:00
		String fechaComoCadena = salida.format(ValidThrufechaSalida);
		System.out.println(fechaComoCadena);

		// Verifico la session
		if (sessionid == null) {
			respuesta.setMsg("Llamada al servicio malformado");
			estatus = HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		} else {
			sessionid = sessionid.substring(7);
			// verifico si la sesión del usuario existe.
			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
			if (encontreSessionUsuario.isPresent()) { // si la sesión del usuario existe
				Date FechaReg = encontreSessionUsuario.get().getValidthru();
				// Llamada a la funcion que validad el tiempo de Session, retorna la fecha
				// sumandole el tiempo de session activa, y vacio si no esta activa
				fechaComoCadena = securityService.consultarSessionActiva(FechaReg, fecha2,
						encontreSessionUsuario.get().getId());

				if (fechaComoCadena == "") {
					RespuestaMsgDto respuestaDto2;
					String var2 = "";
					boolean bloked2 = false;
					respuestaDto2 = new RespuestaMsgDto(var2);
					respuestaDto2.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto2, HttpStatus.UNAUTHORIZED);
				}

				// Obtengo el rol de usuario y verifico si corresponde al privilegio del usuario
				rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 200);
				if (rolisvalid == 0) {
					respuesta.setMsg("No tiene los Privilegios");
					estatus = HttpStatus.FORBIDDEN;
					return new ResponseEntity(respuesta, estatus);
				}

				searchIn = filters.getFilters().getSearch();
				assignedIn = filters.getFilters().getAssigned();
				typeIn = filters.getFilters().getType();

				orderIn = filters.getOrder();// Orden Ascedente o Descendente
				offsetIn = filters.getOffset();// Primer registro a mostrar
				numofrecordsIn = filters.getNumofrecords();// Número de registros a mostrar

				// Verifico si existe el id de la Evaluaciòn del proceso
				Optional<Evalprocesses> obtproceso = evalprocessesRepository.findById(evalprocessid);
				// Verifico si encontre el proceso
				if (!obtproceso.isPresent()) {
					respuesta.setMsg("Registro no encontrado");
					return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
				}

				try {
					Query query;
					Query query2;
					Query query3;
					Query query4;
					String QueryTotal = "";
					String QueryTotal2 = "";
					StatusDto status = new StatusDto();
					String LowerSearch = searchIn.toLowerCase(); // se convierte en minúscula
					EntryReporteRegulatorioDto entryReporteRegulatorioDto = new EntryReporteRegulatorioDto();
					RecordsReporteRegulatorioDto recordsReporteRegulatorioDto = new RecordsReporteRegulatorioDto();
					List<RecordsReporteRegulatorioDto> records = new ArrayList();
					RequestersDto2 requester = new RequestersDto2();
					List<Integer> selected = new ArrayList();
					
					String SentenciaBase2 = "SELECT ep.reportst,"
							+ "                     CASE WHEN ep.reportst=0 THEN 'Abierta' ELSE 'Completada' END AS status "
							+ "              FROM main.evalprocesses ep "
							+ "              WHERE ep.id = :evalprocessid ";

					query4 = entityManager.createNativeQuery(SentenciaBase2);
					query4.setParameter("evalprocessid", evalprocessid);
					cuantosregistro=0L;
					cuantosregistro = (long) query4.getResultList().size();
					List<Object[]> resultadosEstatus = query4.getResultList();
					if (cuantosregistro > 0) {
						for (Object[] fila : resultadosEstatus) {
							status.setId((Integer) fila[0]);
							status.setName((String) fila[1]);
						}
					}
					
					cuantosregistro=0L;
					StatusDto2 status2 = new StatusDto2();
					// Luego consulto la tabla EvalProcess
					String SentenciaBase = "SELECT r.id,   " 
							+ "                    r.name, "
							+ "                    r.dsc, " 
						    + "                    r.frequency, "
							+ "                    r.penalty, "
							+ "                    CASE WHEN er.regreportid IS NULL THEN False ELSE True END AS selected, "
							+ "                    req.id AS requester_id, "
							+ "                    req.name AS requester_name, " 
							+ "                    r.status,                   "
							+ "                    CASE WHEN r.status=1 THEN 'Activa' ELSE 'Inactiva' END AS descstatus "
							+ "                    FROM main.regreports r "
							+ "             LEFT JOIN main.requesters req ON r.requesterid = req.id ";
					switch (assignedIn) {
					case 0:
						QueryTotal = SentenciaBase
								+ " LEFT JOIN main.evalprocreports er ON r.id = er.regreportid AND er.evalprocessid = :evalprocessid "
								+ " LEFT JOIN main.evalprocesses ep ON ep.id=er.evalprocessid "
								+ " WHERE er.regreportid IS NULL";
						break;
					case 1:
						QueryTotal = SentenciaBase
								+ " JOIN main.evalprocreports er ON er.regreportid=r.id AND er.evalprocessid= :evalprocessid "
								+ " LEFT JOIN main.evalprocesses ep ON ep.id=er.evalprocessid ";
						break;
					case -1:
						QueryTotal = SentenciaBase
								+ " LEFT JOIN main.evalprocreports er ON er.regreportid=r.id AND er.evalprocessid= :evalprocessid "
								+ " LEFT JOIN main.evalprocesses ep ON ep.id=er.evalprocessid ";
						;
						break;
					default:
						respuesta.setMsg("Llamada al servicio malformado");
						estatus = HttpStatus.BAD_REQUEST;
						return new ResponseEntity(respuesta, estatus);
					}

					if (searchIn != null) {
						switch (searchIn) {
						case "":
								if (assignedIn==0)
								QueryTotal = QueryTotal + " AND 1=1 ";
							else
								QueryTotal = QueryTotal + " WHERE 1=1 ";
							break;
						default: // viene con el parametro para buscar por el like
							if (assignedIn == 0)
								QueryTotal = QueryTotal + " AND ( main.sinacentos(lower(REPLACE(r.name, '\r\n', ' '))) LIKE  main.sinacentos(" + "'%"
										+ LowerSearch + "%')" + "  OR"
										+ "  main.sinacentos(lower(REPLACE(r.frequency, '\r\n', ' '))) LIKE  main.sinacentos(" + "'%" + LowerSearch
										+ "%')" + "  OR" + "  main.sinacentos(lower(REPLACE(req.name, '\r\n', ' '))) LIKE  main.sinacentos(" + "'%"
										+ LowerSearch + "%')" + "  OR"
										+ "  main.sinacentos(lower(REPLACE(r.penalty, '\r\n', ' '))) LIKE  main.sinacentos(" + "'%" + LowerSearch + "%')"
										+ " ) ";
							else
								QueryTotal = QueryTotal + " WHERE ( main.sinacentos(lower(REPLACE(r.name, '\r\n', ' '))) LIKE  main.sinacentos(" + "'%"
										+ LowerSearch + "%')" + "  OR"
										+ "  main.sinacentos(lower(REPLACE(r.frequency, '\r\n', ' '))) LIKE  main.sinacentos(" + "'%" + LowerSearch
										+ "%')" + "  OR" + "  main.sinacentos(lower(REPLACE(req.name, '\r\n', ' '))) LIKE  main.sinacentos(" + "'%"
										+ LowerSearch + "%')" + "  OR"
										+ "  main.sinacentos(lower(REPLACE(r.penalty, '\r\n', ' '))) LIKE  main.sinacentos(" + "'%" + LowerSearch + "%')"
										+ " ) ";
							break;

						}
					} else {
						respuesta.setMsg("Llamada al servicio malformado");
						estatus = HttpStatus.BAD_REQUEST;
						return new ResponseEntity(respuesta, estatus);
					}

					switch (typeIn) {
					case 0:
						QueryTotal = QueryTotal + " AND 1=1 ";
						break;
					default: // viene con el parametro para buscar por el like
						QueryTotal = QueryTotal + " AND  r.evalprocreporttypepar = " + String.valueOf(typeIn);
						break;
					}

					switch (orderIn) {
					case 1:
						QueryTotal += " ORDER BY r.name ASC";
						break;
					case 2:
						QueryTotal += " ORDER BY req.name ASC";
						break;
					case 3:
						QueryTotal += " ORDER BY r.frequency ASC";
						break;
					case 4:
						QueryTotal += " ORDER BY r.penalty ASC";
						break;
					case -1:
						QueryTotal += " ORDER BY r.name DESC";
						break;
					case -2:
						QueryTotal += " ORDER BY req.name DESC";
						break;
					case -3:
						QueryTotal += " ORDER BY r.frequency DESC";
						break;
					case -4:
						QueryTotal += " ORDER BY r.penalty DESC";
						break;
					default:
						respuesta.setMsg("Llamada al servicio malformado");
						estatus = HttpStatus.BAD_REQUEST;
						return new ResponseEntity(respuesta, estatus);
					}

					System.out.println(QueryTotal);
					query = entityManager.createNativeQuery(QueryTotal);
					query.setParameter("evalprocessid", evalprocessid);

					cuantosregistro = (long) query.getResultList().size();
					query.setFirstResult(offsetIn);
					query.setMaxResults(numofrecordsIn);
					List<Object[]> resultados = query.getResultList();

					String QueryType = "SELECT CAST(elem AS TEXT) " + "	FROM main.params pa, "
							+ "	jsonb_array_elements(CAST(pa.value AS jsonb)) AS elem "
							+ "	WHERE pa.paramname = 'REGREPORT_TYPE' ";

					TypeReportDto typeReportDto = new TypeReportDto();
					List<TypeReportDto> typeReportDtoList = new ArrayList();

					query2 = entityManager.createNativeQuery(QueryType);
					List<Object[]> resultadosType = query2.getResultList();

					JSONObject jsonObject;
					String jsonStringType = "";
					if (resultadosType.size() > 0) {
						for (Object type : resultadosType) {
							jsonStringType = (String) type; // Recupera el JSON como String
							jsonObject = new JSONObject(jsonStringType); // Convierte String a JSONObject
							// Extrae los valores del JSONObject
							String dsc = jsonObject.getString("dsc");
							String value = jsonObject.getString("value");

							typeReportDto.setDsc(dsc);
							typeReportDto.setValue(value);
							typeReportDtoList.add(typeReportDto);
							typeReportDto = new TypeReportDto();
						}
					}
					
					
					
					Integer filter = 0;
					Integer periodo = 0;
					if (cuantosregistro > 0) {
						for (Object[] fila : resultados) {
							recordsReporteRegulatorioDto.setId((Integer) fila[0]);
							recordsReporteRegulatorioDto.setName((String) fila[1]);
							recordsReporteRegulatorioDto.setDsc((String) fila[2]);
							recordsReporteRegulatorioDto.setFrecuency((String) fila[3]);
							recordsReporteRegulatorioDto.setPenality((String) fila[4]);
							recordsReporteRegulatorioDto.setSelected((boolean) fila[5]);
							status2.setId((Integer) fila[8]);
							status2.setName((String) fila[9]);
							recordsReporteRegulatorioDto.setStatus(status2);
							requester.setId((Integer) fila[6]);
							requester.setName((String) fila[7]);
							recordsReporteRegulatorioDto.setRequester(requester);
							records.add(recordsReporteRegulatorioDto);

							recordsReporteRegulatorioDto = new RecordsReporteRegulatorioDto();
							requester = new RequestersDto2();
							status2 = new StatusDto2();
						}

						entryReporteRegulatorioDto.setStatus(status);
						entryReporteRegulatorioDto.setTypes(typeReportDtoList);
						entryReporteRegulatorioDto.setNumofrecords(cuantosregistro);
						entryReporteRegulatorioDto.setRecords(records);
						entryReporteRegulatorioDto.setSessionvalidthru(fechaComoCadena);
						return new ResponseEntity(entryReporteRegulatorioDto, HttpStatus.OK);
						
					} else {
						/*recordsReporteRegulatorioDto.setId(0);
						status.setId(0);
						status.setName("Abierta");
						recordsReporteRegulatorioDto.setName("");
						recordsReporteRegulatorioDto.setDsc("");
						recordsReporteRegulatorioDto.setFrecuency("");
						recordsReporteRegulatorioDto.setPenality("");
						recordsReporteRegulatorioDto.setSelected(false);
						requester.setId(0);
						requester.setName("");
						recordsReporteRegulatorioDto.setRequester(requester);
						records.add(recordsReporteRegulatorioDto);
						entryReporteRegulatorioDto.setStatus(status);
						entryReporteRegulatorioDto.setTypes(typeReportDtoList);
						entryReporteRegulatorioDto.setNumofrecords(cuantosregistro);
						entryReporteRegulatorioDto.setRecords(records);
						entryReporteRegulatorioDto.setSessionvalidthru(fechaComoCadena);*/
						
						return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
					}

					
				} catch (Exception e) {
					respuesta.setMsg("Error interno del servidor " + e.getMessage());
					estatus = HttpStatus.INTERNAL_SERVER_ERROR;
				} finally {
					if (entityManager != null && entityManager.isOpen()) {
						entityManager.close();
					}
				}
			} else { // Si la sesión que viene es inválida
				respuesta.setMsg("Sesión expirada o inválida");
				estatus = HttpStatus.BAD_REQUEST;
				return new ResponseEntity(respuesta, estatus);
			}
			return new ResponseEntity(respuesta, estatus);
		}
	}

	@PostMapping({ "/evalprocesses/{evalprocessid}/reports/set" })
	public ResponseEntity<?> actualizarReporteRegulatorio(HttpServletRequest request,
			@RequestBody ReporteRegulatorioSeleccionarDto reporteRegulatorioSeleccionarDto,
			@PathVariable("evalprocessid") final Integer evalprocessid) throws ParseException {
		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
		RespuestaCantidadDto respuestaCantidad = new RespuestaCantidadDto();
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		long cuantosregistro = 0;

		String sessionid = request.getHeader("Authorization");
		Date fecha = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata = formatter.format(fecha);
		AuditRequestDto auditDto = new AuditRequestDto();
		int rolisvalid = 0;
		String sql = "";
		String LowerSearch = "";
		String module, Descmodule = "";
		Date fecha3 = new Date();
		SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata2 = formatter.format(fecha3);
		Date fechaDate2 = formatter.parse(dataFormattata2);

		Optional<Params> deSessDuration = paramsRepository.findByParamname("SESSION_DURATION");
		String SessionDuration = deSessDuration.get().getValue();
		int duracionSession = Integer.parseInt(SessionDuration);
		Date fecha2 = new Date();
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(fecha2); // tuFechaBase es un Date;
		// calendar.add(Calendar.MINUTE, minutosASumar); //minutosASumar es int.
		calendar.add(Calendar.MINUTE, duracionSession); // horasASumar es int.
		// lo que más quieras sumar
		Date ValidThrufechaSalida = calendar.getTime(); // Y ya tienes la fecha sumada.
		SimpleDateFormat salida = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 2024-12-23 23:00
		String fechaComoCadena = salida.format(ValidThrufechaSalida);
		System.out.println(fechaComoCadena);
		Query query;
		// Verifico la session
		if (sessionid == null) {
			respuesta.setMsg("Llamada al servicio malformado");
			estatus = HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		} else {

			///AQUI SE VALIDA EL ESTATUS DE LA CAMPANA PARA SABER SI SE PUEDE INCLUIR AL REGISTRO O MODIFICAR
			int statusCampaigns =campaignsRepository.findStatusCampaignByProcessId(evalprocessid);

			 if (statusCampaigns==0) {

				String var = "";
				boolean bloked = false;
				RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
					//respuestaDto.setBlocked(bloked);
				respuestaDto.setMsg("No tiene los privilegios");
					//Error 400
				return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);

			}
			sessionid = sessionid.substring(7);
			// verifico si la sesión del usuario existe.
			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
			if (encontreSessionUsuario.isPresent()) { // si la sesión del usuario existe
				Date FechaReg = encontreSessionUsuario.get().getValidthru();
				// Llamada a la funcion que validad el tiempo de Session, retorna la fecha
				// sumandole el tiempo de session activa, y vacio si no esta activa
				fechaComoCadena = securityService.consultarSessionActiva(FechaReg, fecha2,
						encontreSessionUsuario.get().getId());

				if (fechaComoCadena == "") {
					RespuestaMsgDto respuestaDto2;
					String var2 = "";
					boolean bloked2 = false;
					respuestaDto2 = new RespuestaMsgDto(var2);
					respuestaDto2.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto2, HttpStatus.UNAUTHORIZED);
				}

				if (reporteRegulatorioSeleccionarDto.getAction()==null || 
					reporteRegulatorioSeleccionarDto.getFilter() == null ||
					reporteRegulatorioSeleccionarDto.getReportid() == null){
					respuesta.setMsg("Llamada al servicio malformado");
					estatus = HttpStatus.BAD_REQUEST;
					return new ResponseEntity(respuesta, estatus);
				}

				//Verifico si existe el id de la Evaluaciòn del proceso
				Optional<Evalprocesses> obtproceso=evalprocessesRepository.findById(evalprocessid);	    
				Evalprocreports evalprocreports=new Evalprocreports();
				Optional<Regreports> obtreporte2;

			    //Verifico si encontre el proceso
				if (!obtproceso.isPresent()) {
					respuesta.setMsg("Registro no encontrado");
					return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
				}
			    //para varios registros 
			    if (reporteRegulatorioSeleccionarDto.getReportid()==-1 || reporteRegulatorioSeleccionarDto.getReportid()==-2) {
			    	if (reporteRegulatorioSeleccionarDto.getFilter()!="") {
						LowerSearch = reporteRegulatorioSeleccionarDto.getFilter().toLowerCase();
						sql = " SELECT r.id  " + " FROM main.regreports r  "
								+ " LEFT JOIN main.requesters req ON r.requesterid = req.id "
								+ " WHERE ( lower(REPLACE(r.name, '\r\n', ' ')) LIKE  " + "'%" + LowerSearch + "%'"
								+ "  OR" + "         lower(REPLACE(r.frequency, '\r\n', ' ')) LIKE  " + "'%"
								+ LowerSearch + "%'" + "  OR" + "         lower(REPLACE(req.name, '\r\n', ' ')) LIKE  "
								+ "'%" + LowerSearch + "%'" + "  OR"
								+ "         lower(REPLACE(r.penalty, '\r\n', ' ')) LIKE  " + "'%" + LowerSearch + "%'"
								+ " ) ";
					} else {
						sql = " SELECT r.id " + " FROM main.regreports r  "
								+ " LEFT JOIN main.requesters req ON r.requesterid = req.id ";
					}
				}

				// si es un solo registro
				if (reporteRegulatorioSeleccionarDto.getReportid() != -1
						&& reporteRegulatorioSeleccionarDto.getReportid() != -2) {
					// Primero verifico si existe el registro
					// Verifico si existe el id de la Evaluación del reporte
					Optional<Evalprocreports> obtreporte = evalprocreportsRepository
							.findById(reporteRegulatorioSeleccionarDto.getReportid());

					// Verifico si encontre el reporte del proceso
					// if (!obtreporte.isPresent()) {
					sql = " SELECT r.id " + " FROM main.regreports r  "
							+ " LEFT JOIN main.requesters req ON r.requesterid = req.id " + " WHERE r.id = "
							+ reporteRegulatorioSeleccionarDto.getReportid();
					// }

				}

				if (reporteRegulatorioSeleccionarDto.getAction() == 1) { // Seleccionar
					// Obtengo el rol de usuario y verifico si corresponde al privilegio del usuario
					rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(),
							202);
					if (rolisvalid == 0) {
						respuesta.setMsg("No tiene los Privilegios");
						estatus = HttpStatus.FORBIDDEN;
						return new ResponseEntity(respuesta, estatus);
					}

					if (reporteRegulatorioSeleccionarDto.getReportid() == -1) { // seleccionar todos
						// primero debo borrar todos los registros de reporte de evalprocreports
						if (reporteRegulatorioSeleccionarDto.getFilter() == "") { // Sin filtro
							if (evalprocreportsRepository.contarEvalprocreports(evalprocessid) > 0) {
								evalprocreportsRepository.deleteEvalprocreports(evalprocessid);
							}
							evalprocreportsRepository.insertEvalprocreportsSinFilter(evalprocessid);
						} else { // Con filtro
							if (evalprocreportsRepository.cantidadEvalprocreports(
									reporteRegulatorioSeleccionarDto.getFilter().toLowerCase(), evalprocessid) > 0) {
								evalprocreportsRepository.deleteFiltroEvalprocreports(
										reporteRegulatorioSeleccionarDto.getFilter().toLowerCase(), evalprocessid);
							}
							evalprocreportsRepository.insertEvalprocreportsByFilter(
									reporteRegulatorioSeleccionarDto.getFilter().toLowerCase(), evalprocessid);
						}

						// aquí voy a usar el query de arriba, aqui recorro toda la lista
						/*
						 * query = entityManager.createNativeQuery(sql); cuantosregistro = (long)
						 * query.getResultList().size(); List<Integer> resultados =
						 * query.getResultList(); Integer idReporte=0; Integer idProces=0;
						 * 
						 * if (cuantosregistro > 0) { for (Object fila : resultados) { if (fila
						 * instanceof Object[]) { Object[] row = (Object[]) fila; if (row.length > 0 &&
						 * row[0] instanceof Integer) { idReporte = (Integer) row[0]; } } else if (fila
						 * instanceof Integer) { idReporte = (Integer) fila; }
						 * //idReporte=(Integer)fila;
						 * obtreporte2=regreportsRepository.findById(idReporte);
						 * evalprocreports.setCreatedat(FechaReg);
						 * evalprocreports.setModifiedat(FechaReg);
						 * evalprocreports.setEvalprocessid(obtproceso.get());
						 * evalprocreports.setRegreportid(obtreporte2.get());
						 * evalprocreportsRepository.save(evalprocreports); evalprocreports= new
						 * Evalprocreports(); } }
						 */

						// Auditoría
						module = "Evaluación de Reportes regulatorios";
						Descmodule = "Se seleccionaron todos los reportes regulatorios para la evaluación de procesos: "
								+ evalprocessid;
						auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());
						String singo1 = "(";
						String singo2 = ")";
						String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1)
								.concat(encontreSessionUsuario.get().getEmail().concat(singo2));
						auditDto.setUserref(usryemail);
						auditDto.setModule(module);
						auditDto.setDesc(Descmodule);
						auditDto.setCreatedat(fechaDate2);
						usersService.registrarAuditSesion(auditDto);

						if (reporteRegulatorioSeleccionarDto.getFilter() == "") {
							respuestaCantidad = new RespuestaCantidadDto(
									evalprocreportsRepository.contarEvalprocreportes(evalprocessid));
						} else {
							respuestaCantidad = new RespuestaCantidadDto(
									evalprocreportsRepository.cantidadEvalprocreports(
											reporteRegulatorioSeleccionarDto.getFilter().toLowerCase(), evalprocessid));
						}
						URI location = URI.create("/evalprocesses/" + evalprocessid + "/reports/set"); // O la URL
																										// correcta para
																										// // tu recurso

						return ResponseEntity.created(location).body(respuestaCantidad);
					}

					if (reporteRegulatorioSeleccionarDto.getReportid() != -1) {// seleccionar uno
						// primero debo verificar si el reporte existe y si existe lo borro
						if (evalprocreportsRepository.contarEvalprocIdreports(evalprocessid,
								reporteRegulatorioSeleccionarDto.getReportid()) > 0) {
							evalprocreportsRepository.deleteEvalprocesIdreports(evalprocessid,
									reporteRegulatorioSeleccionarDto.getReportid());
						}

						try {
							// aquí voy a usar el query de arriba, aqui recorro toda la lista
							query = entityManager.createNativeQuery(sql);
							cuantosregistro = (long) query.getResultList().size();
							List<Object[]> resultados = query.getResultList();
							Integer idReporte = 0;
							Integer idProces = 0;

							if (cuantosregistro > 0) {
								for (Object fila : resultados) {
									if (fila instanceof Object[]) {
										Object[] row = (Object[]) fila;
										if (row.length > 0 && row[0] instanceof Integer) {
											idReporte = (Integer) row[0];
										}
									} else if (fila instanceof Integer) {
										idReporte = (Integer) fila;
									}
									obtreporte2 = regreportsRepository.findById(idReporte);
									evalprocreports.setCreatedat(FechaReg);
									evalprocreports.setModifiedat(FechaReg);
									evalprocreports.setEvalprocessid(obtproceso.get());
									evalprocreports.setRegreportid(obtreporte2.get());
									evalprocreportsRepository.save(evalprocreports);
									evalprocreports = new Evalprocreports();
								}
							}
						} catch (Exception e) {
							respuesta.setMsg("Error Interno del Servidor");
							return new ResponseEntity(respuesta, HttpStatus.INTERNAL_SERVER_ERROR);
						} finally {
							if (entityManager != null && entityManager.isOpen()) {
								entityManager.close();
							}
						}
						// Auditoría
						module = "Evaluación de Reportes regulatorios";
						Descmodule = "Se seleccionó un reporte regulatorio "
								+ reporteRegulatorioSeleccionarDto.getReportid() + " para la evaluación de procesos: "
								+ evalprocessid;
						auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());
						String singo1 = "(";
						String singo2 = ")";
						String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1)
								.concat(encontreSessionUsuario.get().getEmail().concat(singo2));
						auditDto.setUserref(usryemail);
						auditDto.setModule(module);
						auditDto.setDesc(Descmodule);
						auditDto.setCreatedat(fechaDate2);
						usersService.registrarAuditSesion(auditDto);
						cuantosregistro = 1L;
						RespuestaCantidadDto respuestacantidadDto = new RespuestaCantidadDto(cuantosregistro);
						URI location = URI.create("/evalprocesses/" + evalprocessid + "/reports/set"); // O la URL
																										// correcta para
																										// // tu recurso

						return ResponseEntity.created(location).body(respuestacantidadDto);
					}
				}

				if (reporteRegulatorioSeleccionarDto.getAction() == 2) { // Borrar Seleccionados
					// Obtengo el rol de usuario y verifico si corresponde al privilegio del usuario
					rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(),
							201);
					if (rolisvalid == 0) {
						respuesta.setMsg("No tiene los Privilegios");
						estatus = HttpStatus.FORBIDDEN;
						return new ResponseEntity(respuesta, estatus);
					}

					if (reporteRegulatorioSeleccionarDto.getReportid() == -2) { // deseleccionar todos
						if (reporteRegulatorioSeleccionarDto.getFilter() == "") {
							respuestaCantidad = new RespuestaCantidadDto(
									evalprocreportsRepository.contarEvalprocreportes(evalprocessid));
						} else {
							respuestaCantidad = new RespuestaCantidadDto(
									evalprocreportsRepository.cantidadEvalprocreports(
											reporteRegulatorioSeleccionarDto.getFilter().toLowerCase(), evalprocessid));
						}
						// primero debo borrar todos los registros de reporte de evalprocreports
						if (reporteRegulatorioSeleccionarDto.getFilter() == "") {
							if (evalprocreportsRepository.contarEvalprocreports(evalprocessid) > 0) {
								evalprocreportsRepository.deleteEvalprocreports(evalprocessid);
							}
						} else {
							evalprocreportsRepository.deleteFiltroEvalprocreports(
									reporteRegulatorioSeleccionarDto.getFilter().toLowerCase(), evalprocessid);
						}

						// Auditoría
						module = "Evaluación de Reportes regulatorios";
						Descmodule = "Se Deseleccionaron todos los reportes regulatorios para la evaluación de procesos: "
								+ evalprocessid;
						auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());
						String singo1 = "(";
						String singo2 = ")";
						String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1)
								.concat(encontreSessionUsuario.get().getEmail().concat(singo2));
						auditDto.setUserref(usryemail);
						auditDto.setModule(module);
						auditDto.setDesc(Descmodule);
						auditDto.setCreatedat(fechaDate2);
						usersService.registrarAuditSesion(auditDto);

						URI location = URI.create("/evalprocesses/" + evalprocessid + "/reports/set"); // O la URL
																										// correcta para
																										// // tu recurso

						return ResponseEntity.created(location).body(respuestaCantidad);
					}

					if (reporteRegulatorioSeleccionarDto.getReportid() != -2) {// seleccionar uno
						// primero debo verificar si el reporte existe y si existe lo borro
						if (evalprocreportsRepository.contarEvalprocIdreports(evalprocessid,
								reporteRegulatorioSeleccionarDto.getReportid()) > 0) {
							evalprocreportsRepository.deleteEvalprocesIdreports(evalprocessid,
									reporteRegulatorioSeleccionarDto.getReportid());
						}

						// Auditoría
						module = "Evaluación de Reportes regulatorios";
						Descmodule = "Se Deseleccionó un reporte regulatorio "
								+ reporteRegulatorioSeleccionarDto.getReportid() + " para la evaluación de procesos: "
								+ evalprocessid;
						auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());
						String singo1 = "(";
						String singo2 = ")";
						String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1)
								.concat(encontreSessionUsuario.get().getEmail().concat(singo2));
						auditDto.setUserref(usryemail);
						auditDto.setModule(module);
						auditDto.setDesc(Descmodule);
						auditDto.setCreatedat(fechaDate2);
						usersService.registrarAuditSesion(auditDto);
						cuantosregistro = 1L;
						RespuestaCantidadDto respuestacantidadDto = new RespuestaCantidadDto(1L);
						URI location = URI.create("/evalprocesses/" + evalprocessid + "/reports/set"); // O la URL
																										// correcta para
																										// // tu recurso

						return ResponseEntity.created(location).body(respuestacantidadDto);

					}
				}

			} else { // Si la sesión que viene es inválida
				respuesta.setMsg("Sesión expirada o inválida");
				estatus = HttpStatus.BAD_REQUEST;
				return new ResponseEntity(respuesta, estatus);
			}
			return new ResponseEntity(respuesta, estatus);
		}
	}
}
