package com.dacrt.SBIABackend.controler;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DecimalFormat;
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.persistence.TypedQuery;
import javax.servlet.http.HttpServletRequest;

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.CampaignFormat2Dto;
import com.dacrt.SBIABackend.dto.ChannelsAmountDto;
import com.dacrt.SBIABackend.dto.ChannelsDtoStatus;
import com.dacrt.SBIABackend.dto.ChannelsRecordDto;
import com.dacrt.SBIABackend.dto.RecordCatalogoResponseDto;
import com.dacrt.SBIABackend.dto.RiskFactorsElementDto;
import com.dacrt.SBIABackend.dto.RiskFactorsRecordDto;
import com.dacrt.SBIABackend.dto.ServiceOffersDescDto;
import com.dacrt.SBIABackend.dto.StatusDto;
import com.dacrt.SBIABackend.dto.StatusDto2;
import com.dacrt.SBIABackend.dto.TypesUnitDto;
import com.dacrt.SBIABackend.dto.requestDto.ChannelsRequestDto;
import com.dacrt.SBIABackend.dto.requestDto.RiskFactorRequestDto;
import com.dacrt.SBIABackend.dto.responseDto.ChannelsResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.RickEntryRespondeDto;
import com.dacrt.SBIABackend.dto.responseDto.RiskCategoryResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.RiskFactorsResponseDto;
import com.dacrt.SBIABackend.repository.ChannelsRepository;
import com.dacrt.SBIABackend.repository.RiskfactorelementsRepository;
import com.dacrt.SBIABackend.repository.RiskfactorsRepository;
import com.dacrt.SBIABackend.repository.SuppliersRepository;
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.dto.UsersListDto;
import com.dacrt.SBIABackend.security.entity.Params;
import com.dacrt.SBIABackend.security.entity.Roles;
import com.dacrt.SBIABackend.entity.Channels;
import com.dacrt.SBIABackend.entity.Riskfactorelements;
import com.dacrt.SBIABackend.entity.Riskfactors;
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.ChannelsService;
import com.dacrt.SBIABackend.service.RiskfactorelementsService;
import com.dacrt.SBIABackend.service.RiskfactorsService;
import com.dacrt.SBIABackend.utils.HttpReqRespUtils;

@RestController
@CrossOrigin(origins = "*")
public class RiskfactorsController {
	

	@Autowired
	private ParamsRepository paramsRepository;
	
	@Autowired
	private UsersRepository usersRepository;
	
	@Autowired
	private AuditRepository auditRepository;
	
	@Autowired
	private ChannelsRepository channelsRepository;
	
	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;
	
	@Autowired
	UsersService usersService;
	
	@Autowired
	ParamsService paramsService;
	
	@Autowired
	ChannelsService channelsService;
	
	@Autowired
	SecurityService securityService;
	
	@Autowired
	MenuService menuService;
	
	@PersistenceContext
    private EntityManager entityManager;
	
	@Autowired
	SuppliersRepository suppliersRepository;
	
	@Autowired
	RiskfactorsRepository riskfactorsRepository;
	
	@Autowired
	RiskfactorelementsRepository riskfactorelementsRepository;
	
	@Autowired
	RiskfactorsService riskfactorsService; 
	
	@Autowired
	RiskfactorelementsService riskfactorelementsService; 
	
	@Autowired
    private JdbcTemplate jdbcTemplate;
	
	@Value("${spring.datasource.url}")
	private String conexion;
	
	@Value("${spring.datasource.username}")
	private String userbd;
	
	@Value("${spring.datasource.password}")
	private String passbd;

	@PostMapping("/riskfactors")
	public ResponseEntity<?> listriskfactors(HttpServletRequest request,@RequestBody UsersListDto tiposfiltros) throws ParseException, UnsupportedEncodingException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		ChannelsRecordDto channelsRecordDto = new ChannelsRecordDto();
		RiskFactorsRecordDto riskRecordDto = new RiskFactorsRecordDto();
		RecordCatalogoResponseDto channelsFormatResponseDto = new RecordCatalogoResponseDto();
		CampaignFormat2Dto detalleCompaing2;
		int formatList = 0;
	//	ParamsDto detalleParams;
		CampaignFormat2Dto detalleSuppliers;
		RiskFactorsElementDto detalleRiskFactorsElementDto;
		List<RiskFactorsElementDto> listasRiskFactorsElementDto= new ArrayList<>();
		RiskFactorsRecordDto detalleRiskFactorsRecordDto;
		List<RiskFactorsRecordDto> listasRiskFactorsRecordDto= new ArrayList<>();
		//RiskFactorsResponseDto detalleRiskFactorsResponseDto;
		RiskFactorsResponseDto riskFactorsResponseDto = new RiskFactorsResponseDto();
		 
		StatusDto2 detalleStatus;
		StatusDto2 detalleType;
		StatusDto2 detalleScenery;
		StatusDto detalleStatus2;
		
		StatusDto2 detallecapacityperiod;
		ServiceOffersDescDto detalleserviceoffers;
		RiskFactorsElementDto detalleElements;
		List<TypesUnitDto> listasTypes = new ArrayList<>();
		List<ServiceOffersDescDto> listasOfertas = new ArrayList<>();
		List<RiskFactorsElementDto> listasElementos = new ArrayList<>();
		
		PrivilegesAllDto detallePrivilege;
		
	     
	     Long cuantosregistro = (long) 0;
	     
	     List<PrivilegesAllDto> listasPrivelege = new ArrayList<>();
	     List<ChannelsRecordDto> listasRecord= new ArrayList<>();
	     List<RiskFactorsRecordDto> listasRecordRisk= new ArrayList<>();
	     TypesUnitDto detalleTypes;
	     TypesUnitDto detallePeriodos;
	     List<TypesUnitDto> listasPeriodos = new ArrayList<>();
		 
		 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();
	       
	        
	     
	       
	      int idrol;
	   	  String searchIn = "";
	   	  String contentIn = "";
	     // String searchModule = "";
		  int searchStatus = 0;
		  int typeIn=0;
		  String fechaComoCadena; 
		 int orderIn = 0;
		 int offsetIn = 0;
		 int numofrecordsIn = 0;
		 Date fecha2 = new Date();
		
			if (sessionid==null) {
				String var = "";
				boolean bloked = false;
				RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
				respuestaDto.setBlocked(bloked);
				respuestaDto.setMsg("Sesión expirada o inválida");
				//Error 400
				return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
			} else   {
				 
				   sessionid = sessionid.substring(7);
				   Optional<Users> encontreSessionUsuario =usersRepository.getBySessionid(sessionid);
				//   String usuarioIN = encontreSessionUsuario.get().getUsr();
				 //  int position = usuarioIN.indexOf('('); 
				   
				   if (encontreSessionUsuario.isPresent()) {
					   
					   Date FechaReg = encontreSessionUsuario.get().getValidthru(); 

					   //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);
						   
					    }
					    formatList = tiposfiltros.getFormat();
					    try {
					        if (formatList==0) {
					    	   formatList = 1;
					        } else {
					    	formatList = tiposfiltros.getFormat();
					       }
					    }catch (Exception e) {
					    	formatList = 1;
					    }
					  // Este proceso permite obtener un listado de los proveedores. (Priv 440)
					   Roles roles = encontreSessionUsuario.get().getRolid();
					   idrol = roles.getId();
					   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 800);
					   if (formatList!=2) {
					        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);
					        }	
					    }
						 // searchIn = tiposfiltros.getFilters().getSearch();
						  searchIn = tiposfiltros.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);
						  }
						 
						       
						   searchIn = usersService.eliminarAcentosService(tiposfiltros.getFilters().getSearch());
						   searchStatus = tiposfiltros.getFilters().getStatus();
					
						  orderIn = tiposfiltros.getOrder();
						  offsetIn = tiposfiltros.getOffset();
						  numofrecordsIn = tiposfiltros.getNumofrecords();
						  contentIn = tiposfiltros.getContent();
						  
						  
						  try {
							//  String typeIn2 = tiposfiltros.getFilters().getType();
							  typeIn= tiposfiltros.getFilters().getSceneryid();
							 // typeIn  = Integer.parseInt(typeIn2);
								 if (typeIn==0) {
									  typeIn = 0;
								  }
								  
							  }  catch (Exception e) { 
								  
								  typeIn = 0;
								  
							  }
							
						  
						  if (contentIn !=null) {
						     menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());
						  }
						 
					
					
				 } else {
						String var = "";
						boolean bloked = false;
						RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
						respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Sesión expirada o inválida");
						//Error 400
						return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
				 }
			}
			
			
		
		try {
			
			String SentenciaBase;
			if (formatList==2) {	
			   SentenciaBase = "SELECT  new com.dacrt.SBIABackend.dto.ChannelsDtoStatus "
						+ " (f.id,  f.name, f.status, "
						+ "	 CASE "
						+ "	WHEN f.status = 1 THEN 'Activo' "
						+ "	ELSE 'Inactivo' "
						+ "	END AS estatus ) "
						+ "	FROM "
						+ "	Riskfactors f ";
			} else { 
			
			
		    	// SentenciaBase = "SELECT new com.dacrt.SBIABackend.dto.ChannelsDtoStatus (u.id,u.name,u.status,CASE WHEN u.status = 1 then 'Activo' ELSE 'Inactivo' END AS estatus) FROM Channels u";
				
				SentenciaBase = " SELECT  "
						+ "    f.id,  "
						+ "    f.name,  "
						+ "    f.category,  "
						+ "    f.scenery,  "
						+ "    f.status,  "
						+ " CASE WHEN f.status = 1 THEN 'Activo' ELSE 'Inactivo' END AS estatus, "
						+ "    pr.descr AS scenery_name, "
						+ "    COUNT(e.id) AS totalelementos,  "
						+ "    STRING_AGG(e.name, ',') AS elementos, "
						+ "    STRING_AGG(CAST(e.id AS TEXT), ',') AS idelemento,  "
						+ "    STRING_AGG(CAST(e.weight AS TEXT), ',') AS weights  "
						+ " FROM main.riskfactors f "
						+ " LEFT JOIN main.riskfactorelements e ON f.id = e.riskfactorid "
						+ " 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 = 'RISK_SCENERIES' "
						+ " ) pr ON f.scenery = CAST(pr.valor AS integer)  ";
			}				
				
				Query query;
				String groupby = " GROUP BY f.id, f.name, f.category, f.scenery, f.status, f.createdat, f.modifiedat, pr.descr ";
				
			String QueryTotal = "";
			String name = "f.name";
			String status = "f.status";				
			String lowername = "main.sinacentos(LOWER(f.name))";
			String lowercategory = "main.sinacentos(LOWER(f.category))";
			String lowerdscParams = "main.sinacentos(LOWER(pr.descr))";
			String LowerSearch = searchIn.toLowerCase();
			
			 switch (searchIn) { 
			    case "":  // viene sin busqueda por el like
			    	
			    	QueryTotal = SentenciaBase  + " WHERE TRUE = TRUE";
			     break;
			  
			    default:	// viene con el parametro para buscar por el like		
			    	   if (formatList==1) {
			         	QueryTotal = SentenciaBase + " WHERE (" + lowername + " LIKE  " + "'%" + LowerSearch + "%'"  + " OR " +  lowercategory + " LIKE " + "'%" + LowerSearch + "%' " + " OR " + lowerdscParams + " LIKE " + "'%" + LowerSearch + "%')";
			    	   } else {
			    	   QueryTotal = SentenciaBase + " WHERE " + lowername + " LIKE  " + "'%" + LowerSearch + "%'";
			    	   }
			    	
	         }
			 
			 switch (searchStatus) { 
			    case 0:  // Busca por cualquier estatus
			    	QueryTotal = QueryTotal;
			     break;
			    case 1:  // Busca por estatus activo
			    	
			    	QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
			     break;
			    case 2:  // Busca por estatus Inactivo
			    	
			    	//QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
			    	QueryTotal = QueryTotal  + " AND " + status + " = " + 0;
			     break;
			  
			    default:	// viene con el parametro para buscar por el like		   			    				    	
			    	String var2 = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
					respuestaDto= new RespuestaMsgDto("Error interno del servidor");
					estatus=HttpStatus.INTERNAL_SERVER_ERROR;   
					return new ResponseEntity(respuestaDto, estatus);
			    	
	         }
			 
		 if (formatList==1) {
			    switch (typeIn) { 
			    case 0:  // Busca por cualquier estatus
			      	QueryTotal = QueryTotal;
			     break;
			    case 1:  // Busca por estatus activo
			    	
			    	QueryTotal = QueryTotal  + " AND " + " f.scenery " + " = " + typeIn;
			     break;
			    case 2:  // Busca por estatus Inactivo
			    	
			    	//QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
			    	QueryTotal = QueryTotal  + " AND " + " f.scenery " + " = " + typeIn;
			     break;
			     
                 case 3:  // Busca por estatus Inactivo
			    	
			    	//QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
			    	QueryTotal = QueryTotal  + " AND " +  " f.scenery " + " = " + typeIn;
			     break;
                 case 4:  // Busca por estatus Inactivo
 			    	
 			    	//QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
 			    	QueryTotal = QueryTotal  + " AND " +  " f.scenery " + " = " + typeIn;
 			     break;
                 case 5:  // Busca por estatus Inactivo
 			    	
 			    	//QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
 			    	QueryTotal = QueryTotal  + " AND " +  " f.scenery " + " = " + typeIn;
 			     break;
			    default:	// viene con el parametro para buscar por el like		   			    				    	
			    	String var2 = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
					respuestaDto= new RespuestaMsgDto("Error interno del servidor");
					estatus=HttpStatus.INTERNAL_SERVER_ERROR;   
					return new ResponseEntity(respuestaDto, estatus);
			    	
	         }
		 }	    
			 
			    
			 if (formatList==1) {
			    	 QueryTotal = QueryTotal + groupby;
			         query = entityManager.createNativeQuery(QueryTotal);
			         		     			 			 			
			 
			 String ordena="";
			  if (orderIn == 1 || orderIn == 2 || orderIn == 3 || orderIn == 4 || orderIn == 99) {
				  ordena = " ASC";
			 }  else if (orderIn == -1 || orderIn == -2 || orderIn == -3 || orderIn == -4 || orderIn == -99) {
				  ordena = " DESC";
			 } else {
				 	String var2 = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
					respuestaDto= new RespuestaMsgDto("Error interno del servidor");
					estatus=HttpStatus.INTERNAL_SERVER_ERROR;   
					return new ResponseEntity(respuestaDto, estatus);
			 }		
			 int absolutoOrden = Math.abs(orderIn);			 			 			 			 
			 switch (absolutoOrden) { 
			    case 1:  //ordena por name ascendente
			    	
			    	QueryTotal = QueryTotal + " ORDER BY " + name + ordena + "," + " pr.descr " + ordena;
			     break;
			    case 2://ordena por status ascendente
			    	
			    	QueryTotal = QueryTotal + " ORDER BY " + " f.category " + ordena;
			     break;	
                case 3:  //ordena por name ascendente
			    	
			    	QueryTotal = QueryTotal + " ORDER BY " + name + ordena;
			     break;
                case 4:  //ordena por name ascendente
 	
 	             QueryTotal = QueryTotal + " ORDER BY " + " totalelementos " + ordena;
                 break;
                case 99:   //ordena por status ascendente
                	
                    QueryTotal = QueryTotal + " ORDER BY " + " f.id " + ordena;
                break; 
			 
			    
			   }
		}  else {
					     			 			 			
	 
	 String ordena="";
	  if (orderIn == 1 || orderIn == 2 ||  orderIn == 99) {
		  ordena = " ASC";
	 }  else if (orderIn == -1 || orderIn == -2 || orderIn == -99) {
		  ordena = " DESC";
	 } else {
		 	String var2 = "";
			boolean bloked = false;
			RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
			respuestaDto= new RespuestaMsgDto("Error interno del servidor");
			estatus=HttpStatus.INTERNAL_SERVER_ERROR;   
			return new ResponseEntity(respuestaDto, estatus);
	 }		
	 int absolutoOrden = Math.abs(orderIn);			 			 			 			 
	 switch (absolutoOrden) { 
	    case 1:  //ordena por name ascendente
	    	
	    	QueryTotal = QueryTotal + " ORDER BY " + name + ordena;
	     break;
	    case 2://ordena por status ascendente
	    	
	    	QueryTotal = QueryTotal + " ORDER BY " + status + ordena;
	     break;	
        case 99:   //ordena por status ascendente
        	
            QueryTotal = QueryTotal + " ORDER BY " + " f.id " + ordena;
        break; 
	 
	    
	   }
	}
			 if (formatList!=2) {  
	     
			   
				       query = entityManager.createNativeQuery(QueryTotal);
				       query.setFirstResult(offsetIn);
					   query.setMaxResults(numofrecordsIn);
					   List<Object[]> listacompleta = query.getResultList();
				
					   cuantosregistro = (long) query.getResultList().size();	
			   
		    	   List<CampaignFormat2Dto> listasSuppliers = new ArrayList<>();
		    	   detalleSuppliers = new CampaignFormat2Dto();
		    	  
		    		 for (Object[] reg : listacompleta) {	   
		    		   detalleSuppliers = new CampaignFormat2Dto();
		    		   channelsRecordDto = new ChannelsRecordDto();
		    		   riskRecordDto = new RiskFactorsRecordDto();
		    		   detalleStatus = new StatusDto2();
		    		   detalleScenery = new StatusDto2();
		    		  
		    		   detallecapacityperiod = new StatusDto2();
		    		   detalleserviceoffers = new ServiceOffersDescDto();
		    		   
		    		
		    		   ///////////////////////llenando el scenery//////////////////
		    		   detalleScenery.setId((int) reg[3]);
		    		   detalleScenery.setName((String) reg[6]);
		    		   ///////////////////////////////////////////////////////
		    		   
		    		   /////////////////////llenando el estatus//////////////////////
		    		   detalleStatus.setId((int) reg[4]);
			    	   detalleStatus.setName((String) reg[5]);			    	   			    	   				 
			    	   
		    		   //////////////////////////////////////////////////////////////
		    		   //////////////////comienzo a llenar el dto de factores de riesgo///////////////////
		    		   riskRecordDto.setId((int) reg[0]);
		    		   riskRecordDto.setName((String) reg[1]);
		    		   riskRecordDto.setCategory((String) reg[2]);
		    		   riskRecordDto.setScenery(detalleScenery);
		    		   riskRecordDto.setStatus(detalleStatus);
		    		   //////////////////////////////////////////////////////////////////////////////
		    		
			    	     
			    	       String NameElements = (String) reg[8]; // AQUI VIENEN LOS ID DE LAS OFERTAS ASOCIADAS
			    		   String IdElements = (String) reg[9]; // AQUI VIENEN LOS NOMBRES DE LAS  OFERTAS ASOCIADAS
			    		   String WeigthElements = (String) reg[10]; // AQUI VIENEN LOS TIPOS DE OFERTAS ASOCIADAS, INDICATIVO DE SI SON 24X7
			    		   
			    		   
			    		   if (NameElements != null && !IdElements.isEmpty()) {
						    	
						        String[] Idelements = IdElements.split(",");
						        String[] Nameelements = NameElements.split(",");
						        String[] Weigthelements = WeigthElements.split(",");
						        int i = 0;
						       
						        listasElementos = new ArrayList<>();
						        for (String ofeId : Idelements) {
						        	
						        	detalleElements= new  RiskFactorsElementDto();
						        	String NombreEle = Nameelements[i];
						        	String IdEle = Idelements[i];
						        	String WeigthEle = Weigthelements[i];
						        	
					    	          detalleElements.setId(Integer.parseInt(IdEle));
					    	          detalleElements.setName(NombreEle);
					    	          detalleElements.setWeight(Integer.parseInt(WeigthEle));					    	    					    	         
							    	  
					    	          listasElementos.add(detalleElements);
						        	i = i+1;
						        }
						    }  else {
						    	listasElementos = new ArrayList<>();
						    	detalleElements = new RiskFactorsElementDto();
						    	
						    }				    		   
			    	        			     
			    		   riskRecordDto.setElements(listasElementos);		    		 
			    		   listasRecordRisk.add(riskRecordDto);
		    	   }
		    	
		    	   
      	    	 	detallePrivilege = new PrivilegesAllDto();
      	    	       boolean tieneView = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,800);
					   boolean tieneUpdate = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,801);
					   boolean tieneAdd = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,802);
					   boolean tieneDelete = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,803);
					   //existsByRolidAndPrivilegeid
					   
	      	    	 	detallePrivilege.setView(tieneView);
			    	  	detallePrivilege.setUpdate(tieneUpdate);		    	  
			    	  	detallePrivilege.setAdd(tieneAdd);
			    	  	detallePrivilege.setDelete(tieneDelete);
			    	  	
			    	  	
			    	  	 String SetenciaSceneries="";
							
			    	  	SetenciaSceneries= "SELECT  elemento ->> 'dsc' AS descr,elemento ->> 'value' AS valor "
					 		+ " FROM main.params p, jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento WHERE paramname = 'RISK_SCENERIES' ORDER BY valor ASC";
					      
					      Query queryTypes = entityManager.createNativeQuery(SetenciaSceneries);
					       List<Object[]> listasceneries= queryTypes.getResultList();
					       for (Object[] types : listasceneries) {
					    	   detalleTypes = new TypesUnitDto();
					    	  
					    	   detalleTypes.setDsc((String) types[0]);
					    	   detalleTypes.setValue((String) types[1]);
					    	   listasTypes.add(detalleTypes);
					       }
		    	          
					       riskFactorsResponseDto.setNumofrecords(cuantosregistro); 
					       riskFactorsResponseDto.setSessionvalidthru(fechaComoCadena);
					       riskFactorsResponseDto.setRecords(listasRecordRisk);
					       riskFactorsResponseDto.setPrivileges(detallePrivilege);
					       riskFactorsResponseDto.setSceneries(listasTypes);
		    	   	    	   			
		  						           
                return ResponseEntity.ok(riskFactorsResponseDto);
		     						
			 } else {
				 
				 TypedQuery<ChannelsDtoStatus> suppliers= entityManager.createQuery(QueryTotal, ChannelsDtoStatus.class);
				  List<ChannelsDtoStatus> listacompleta = suppliers.getResultList();
				  List<CampaignFormat2Dto> listasSuppliers2 = new ArrayList<>();
				  
				  
				  for(ChannelsDtoStatus suppli : listacompleta) {
		    		   detalleCompaing2 = new CampaignFormat2Dto();
		    		 
		    		   detalleStatus2 = new StatusDto();
		    		   detalleCompaing2.setId(suppli.getId());
		    		   detalleCompaing2.setName(suppli.getName());
		    		
				     
		    		   detalleStatus2.setId(suppli.getStatus());
			    	   detalleStatus2.setName(suppli.getEstatus());
				     
			    	   detalleCompaing2.setStatus(detalleStatus2);
			    	   
			    	   listasSuppliers2.add(detalleCompaing2);
		    	   }
				  
				       
				          channelsFormatResponseDto.setSessionvalidthru(fechaComoCadena);		           
				          channelsFormatResponseDto.setRecords(listasSuppliers2);
			  						           
	                return ResponseEntity.ok(channelsFormatResponseDto);

			 }  
	
		} catch (Exception e) {
            // Manejo de excepciones
			respuesta= new RespuestaDto("Error interno del servidor", false);
			estatus=HttpStatus.INTERNAL_SERVER_ERROR;            
        } finally {
	        if (entityManager != null && entityManager.isOpen()) {
	            entityManager.close();
	        }
	    }
		
		return new ResponseEntity(respuesta, estatus);
	
	}

	
	//	@GetMapping("/channels/{channelid}")
	//public ResponseEntity<?> getOneVP(HttpServletRequest request, @PathVariable("channelid") final Integer channelid) throws ParseException {
	
	@GetMapping("/riskfactors/{riskfactorid}")
	public ResponseEntity<?> getoneriskfactors(HttpServletRequest request, @PathVariable("riskfactorid") final Integer riskfactorid) throws ParseException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		ChannelsRecordDto channelsRecordDto = new ChannelsRecordDto();
		RiskFactorsRecordDto riskRecordDto = new RiskFactorsRecordDto();
		RecordCatalogoResponseDto channelsFormatResponseDto = new RecordCatalogoResponseDto();
		CampaignFormat2Dto detalleCompaing2;
	//	ParamsDto detalleParams;
		RiskFactorsElementDto detalleRiskFactorsElementDto;
		
		
		RickEntryRespondeDto detalleRickEntryRespondeDto=null;
		RiskFactorsRecordDto detalleRiskFactorsRecordDto;
		List<RiskFactorsRecordDto> listasRiskFactorsRecordDto= new ArrayList<>();
		 
		StatusDto2 detalleStatus;
		StatusDto2 detalleType;
		StatusDto2 detalleScenery;
		StatusDto detalleStatus2;
		
		StatusDto2 detallecapacityperiod;
		ServiceOffersDescDto detalleserviceoffers;
		RiskFactorsElementDto detalleElements;
		List<TypesUnitDto> listasTypes = new ArrayList<>();
		List<ServiceOffersDescDto> listasOfertas = new ArrayList<>();
		List<RiskFactorsElementDto> listasElementos = new ArrayList<>();
		
	
	     
	     Long cuantosregistro = (long) 0;
	     
	     List<ChannelsRecordDto> listasRecord= new ArrayList<>();
	     List<RiskFactorsRecordDto> listasRecordRisk= new ArrayList<>();
	     TypesUnitDto detalleTypes;
	     TypesUnitDto detallePeriodos;
	     List<TypesUnitDto> listasPeriodos = new ArrayList<>();
		 
		 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();
	       
	        
	     
	       
	      int idrol;
	   	  String searchIn = "";
	   	  String contentIn = "";
	     // String searchModule = "";
		  int searchStatus = 0;
		  int typeIn=0;
		  String fechaComoCadena; 
		 int orderIn = 0;
		 int offsetIn = 0;
		 int numofrecordsIn = 0;
		 Date fecha2 = new Date();
		
			if (sessionid==null) {
				String var = "";
				boolean bloked = false;
				RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
				respuestaDto.setBlocked(bloked);
				respuestaDto.setMsg("Sesión expirada o inválida");
				//Error 400
				return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
			} else   {
				 
				   sessionid = sessionid.substring(7);
				   Optional<Users> encontreSessionUsuario =usersRepository.getBySessionid(sessionid);
				//   String usuarioIN = encontreSessionUsuario.get().getUsr();
				 //  int position = usuarioIN.indexOf('('); 
				   
				   if (encontreSessionUsuario.isPresent()) {
					   
					   Date FechaReg = encontreSessionUsuario.get().getValidthru(); 

					   //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);
						   
					    }
					
					  // Este proceso permite obtener un listado de los proveedores. (Priv 440)
					   Roles roles = encontreSessionUsuario.get().getRolid();
					   idrol = roles.getId();
					   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 801);
					
					        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);
					        }	
					    
						  
						  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);
						  }
						 
						       
						 
						
						  
						  if (contentIn !=null) {
						     menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());
						  }
						 
					
					
				 } else {
						String var = "";
						boolean bloked = false;
						RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
						respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Sesión expirada o inválida");
						//Error 400
						return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
				 }
			}
			
			
		
		try {
			
			String SentenciaBase;
		    	// SentenciaBase = "SELECT new com.dacrt.SBIABackend.dto.ChannelsDtoStatus (u.id,u.name,u.status,CASE WHEN u.status = 1 then 'Activo' ELSE 'Inactivo' END AS estatus) FROM Channels u";
				
				SentenciaBase = " SELECT  "
						+ "    f.id,  "
						+ "    f.name,  "
						+ "    f.category,  "
						+ "    f.scenery,  "
						+ "    f.status,  "
						+ " CASE WHEN f.status = 1 THEN 'Activo' ELSE 'Inactivo' END AS estatus, "
						+ "    pr.descr AS scenery_name, "
						+ "    COUNT(e.id) AS totalelementos,  "
						+ "    STRING_AGG(e.name, ',') AS elementos, "
						+ "    STRING_AGG(CAST(e.id AS TEXT), ',') AS idelemento,  "
						+ "    STRING_AGG(CAST(e.weight AS TEXT), ',') AS weights  "
						+ " FROM main.riskfactors f "
						+ " LEFT JOIN main.riskfactorelements e ON f.id = e.riskfactorid "
						+ " 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 = 'RISK_SCENERIES' "
						+ " ) pr ON f.scenery = CAST(pr.valor AS integer)  "
						+ "  	 WHERE f.id =" + riskfactorid ;
					
				
				Query query;
				String groupby = " GROUP BY f.id, f.name, f.category, f.scenery, f.status, f.createdat, f.modifiedat, pr.descr ";
				
			      String QueryTotal = SentenciaBase + groupby;
							     							     			 			
				       query = entityManager.createNativeQuery(QueryTotal);
				       query.setFirstResult(offsetIn);
					   query.setMaxResults(numofrecordsIn);
					   List<Object[]> listacompleta = query.getResultList();
				
					   cuantosregistro = (long) query.getResultList().size();	
			   
		    	   List<CampaignFormat2Dto> listasSuppliers = new ArrayList<>();
		    	  
		    		 for (Object[] reg : listacompleta) {	   
		    		   riskRecordDto = new RiskFactorsRecordDto();
		    		   detalleStatus = new StatusDto2();
		    		   detalleScenery = new StatusDto2();
		    		  
		    		   detallecapacityperiod = new StatusDto2();
		    		   detalleserviceoffers = new ServiceOffersDescDto();
		    		   
		    		
		    		   ///////////////////////llenando el scenery//////////////////
		    		   detalleScenery.setId((int) reg[3]);
		    		   detalleScenery.setName((String) reg[6]);
		    		   ///////////////////////////////////////////////////////
		    		   
		    		   /////////////////////llenando el estatus//////////////////////
		    		   detalleStatus.setId((int) reg[4]);
			    	   detalleStatus.setName((String) reg[5]);			    	   			    	   				 
			    	   
		    		   //////////////////////////////////////////////////////////////
		    		   //////////////////comienzo a llenar el dto de factores de riesgo///////////////////
		    		   riskRecordDto.setId((int) reg[0]);
		    		   riskRecordDto.setName((String) reg[1]);
		    		   riskRecordDto.setCategory((String) reg[2]);
		    		   riskRecordDto.setScenery(detalleScenery);
		    		   riskRecordDto.setStatus(detalleStatus);
		    		   //////////////////////////////////////////////////////////////////////////////
		    		
			    	     
			    	       String NameElements = (String) reg[8]; // AQUI VIENEN LOS ID DE LAS OFERTAS ASOCIADAS
			    		   String IdElements = (String) reg[9]; // AQUI VIENEN LOS NOMBRES DE LAS  OFERTAS ASOCIADAS
			    		   String WeigthElements = (String) reg[10]; // AQUI VIENEN LOS TIPOS DE OFERTAS ASOCIADAS, INDICATIVO DE SI SON 24X7
			    		   
			    		   
			    		   if (NameElements != null && !IdElements.isEmpty()) {
						    	
						        String[] Idelements = IdElements.split(",");
						        String[] Nameelements = NameElements.split(",");
						        String[] Weigthelements = WeigthElements.split(",");
						        int i = 0;
						       // listasUnits = new ArrayList<>();
						        //listasOfertas = new ArrayList<>();
						        listasElementos = new ArrayList<>();
						        for (String ofeId : Idelements) {
						        	
						        	detalleElements= new  RiskFactorsElementDto();
						        	String NombreEle = Nameelements[i];
						        	String IdEle = Idelements[i];
						        	String WeigthEle = Weigthelements[i];
						        	
					    	          detalleElements.setId(Integer.parseInt(IdEle));
					    	          detalleElements.setName(NombreEle);
					    	          detalleElements.setWeight(Integer.parseInt(WeigthEle));
					    	    
					    	          
							    	  
					    	          listasElementos.add(detalleElements);
							    	  //listasOfertas
						        	i = i+1;
						        }
						    }  else {
						    	listasElementos = new ArrayList<>();
						    	detalleElements = new RiskFactorsElementDto();
						    	
						    }		
			    		   
			    	         			     
			    		   riskRecordDto.setElements(listasElementos);
			    		 
			    	
			    		   listasRecordRisk.add(riskRecordDto);
		    	   }		    			    	     	    
			    	  	
			    	  	 String SetenciaSceneries="";
							
			    	  	SetenciaSceneries= "SELECT  elemento ->> 'dsc' AS descr,elemento ->> 'value' AS valor "
					 		+ " FROM main.params p, jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento WHERE paramname = 'RISK_SCENERIES' ORDER BY valor ASC";
					      
					      Query queryTypes = entityManager.createNativeQuery(SetenciaSceneries);
					       List<Object[]> listasceneries= queryTypes.getResultList();
					       for (Object[] types : listasceneries) {
					    	   detalleTypes = new TypesUnitDto();
					    	  
					    	   detalleTypes.setDsc((String) types[0]);
					    	   detalleTypes.setValue((String) types[1]);
					    	   listasTypes.add(detalleTypes);
					       }
					       detalleRickEntryRespondeDto = new RickEntryRespondeDto();
					       detalleRickEntryRespondeDto.setEntry(riskRecordDto);
					       detalleRickEntryRespondeDto.setSceneries(listasTypes);
		    	   	      		   			
		  						           
                return ResponseEntity.ok(detalleRickEntryRespondeDto);
		     						
			 
	
		} catch (Exception e) {
            // Manejo de excepciones
			respuesta= new RespuestaDto("Error interno del servidor", false);
			estatus=HttpStatus.INTERNAL_SERVER_ERROR;            
        } finally {
	        if (entityManager != null && entityManager.isOpen()) {
	            entityManager.close();
	        }
	    }
		
		return new ResponseEntity(respuesta, estatus);
	
	}
	
	
	@PostMapping("/riskfactors/{riskfactorid}")
	public ResponseEntity<ParamsResponseDto> RiskUpsert(HttpServletRequest request,@RequestBody RiskFactorRequestDto datosrisk,@PathVariable("riskfactorid") final Integer riskfactorid) throws ParseException, SQLException {
			
			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 = riskfactorid;
			 Connection conexion2 = DriverManager.getConnection(conexion,userbd, passbd);
			 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);
	  						   
	  					    }
	  					    
	  					  String Salida = usersService.verificarCaracteresValidosConRegex(datosrisk.getName());
	  					  
	  					  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);
	  					  }
	  					  
	  	                 String SalidaDsc = usersService.verificarCaracteresValidosConRegex(datosrisk.getCategory());
	  					  
	  					  if (SalidaDsc=="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);
	  					  }
	  					  
	  					   
						 //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, 802);
							  // 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, 803);
						 //  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 existeCanal = channelsRepository.existsById(riskfactorid);
						   
						      if  (!existeCanal) {	
							   
							  
							    
							    	String var = "";
							    	RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
									//respuestaDto.setBlocked(bloked);
									respuestaDto.setMsg("Registro No encontrado");
									//Error 400
									return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
							    
						       }
						   } 
						   						                        						 							
						   
						 if (idparametro==0) {
							   
	                       if  (datosrisk.getName()!= "" ) {	
								   
								   //boolean existeRef = unitsRepository.existsByRef(datosUnidad.getRef());
								   String Query1 = "SELECT name FROM main.riskfactors WHERE LOWER(name) = " + "'" + datosrisk.getName().toString().toLowerCase() + "'" ;
								   Long cuantosregistroref = (long) jdbcTemplate.queryForList(Query1).size();
								   
								    if (cuantosregistroref>0) {
								    	String var = "";
								    	RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
										//respuestaDto.setBlocked(bloked);
										respuestaDto.setMsg("Registro Duplicado");
										//Error 400
										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 {
				
			
				Riskfactors tipoRisk2=null;
				Riskfactors tipoRisk=null;
				Riskfactors tipoRiskNew2=null;
				Optional<Riskfactors> nuevoinsertado = null;
				
				int cantidadAlmacenarCapacity = 0;
				if (idparametro==0) {
					
					Riskfactors tipoRiskNew = new Riskfactors();
					
					if (datosrisk.getScenery()==0) {
					    	            
		                	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);	              
				    }
					
					//Workers
					//datosWorker
					tipoRiskNew.setStatus(datosrisk.getStatus());
					tipoRiskNew.setModifiedat(fechaDate);
					tipoRiskNew.setCreatedat(fechaDate); 
					tipoRiskNew.setName(datosrisk.getName());
					tipoRiskNew.setCategory(datosrisk.getCategory());
					tipoRiskNew.setScenery(datosrisk.getScenery());
					
					
					
					
					
					// typeIn  = Integer.parseInt(typeIn2);
					tipoRiskNew2=riskfactorsService.addIdRiskfactors(tipoRiskNew);
					tipoRisk2= tipoRiskNew2;
					nuevoinsertado = riskfactorsRepository.findByName(datosrisk.getName());
					int idInsertado =  nuevoinsertado.get().getId();
					int idmensaje = idInsertado;
					
				
					if (datosrisk.getElements() == null || datosrisk.getElements().isEmpty()) {
				        String mensaje = "No vienen elementos";
				    } else {

				    	   datosrisk.getElements().forEach(elemento -> {
				    	 
				    	   
				            Integer idele = elemento.getId();
				            String nombreEl = elemento.getName();
				            int pesoEle = elemento.getWeight();
				            Riskfactorelements tipoRiskElementNew = new Riskfactorelements();
				            Riskfactorelements tipoRiskElementNew2 = new Riskfactorelements();
				            Statement sentenciaPreparada = null;
				            int idfactorrisk=0;
				            try {
								sentenciaPreparada = conexion2.createStatement();
							} catch (SQLException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
				            //Riskfactors objetoanterior = riskfactorsRepository.getById(pesoEle);
				          
				            if ((idele==0) || (idele<0) ) {
				            	String mensaje = "No hace nada";
				            } else {
				            	  
				            	  Riskfactorelements objetoanterior = riskfactorelementsRepository.getById(idele);
						             idfactorrisk = objetoanterior.getRiskfactorid().getId();
				            }
				           if (idele > 0) {
				            // Lógica para ACTUALIZAR
				               System.out.println("Actualizando elemento ID: " + idele + " - " + nombreEl);
				          
				               String sql = "UPDATE main.riskfactorelements SET " +
				                       "weight = " + BigDecimal.valueOf(pesoEle) + ", " +
				                       "name = '" + nombreEl + "', " +
				                       "riskfactorid = " + idInsertado + " " +
				                       "WHERE id = " + idele + " AND riskfactorid = " + idfactorrisk;
				               int filasInsertadas=0;
			    	            try {
									filasInsertadas = sentenciaPreparada.executeUpdate(sql);
								} catch (SQLException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
				            
				             } else if (idele < 0) {
				            // Lógica para BORRAR (se suele usar el valor absoluto del ID)
				                System.out.println("Borrando elemento ID: " + Math.abs(idele));
				                // DELETE FROM Riskfactorelements e where e.id = ?1 and e.riskfactorid = ?2
				                String sql = " DELETE FROM  main.riskfactorelements " +
					                       " WHERE  name = '" + nombreEl + "' ";
					               int filasInsertadas=0;
				    	            try {
										filasInsertadas = sentenciaPreparada.executeUpdate(sql);
									} catch (SQLException e) {
										// TODO Auto-generated catch block
										e.printStackTrace();
									}
				            
				              } else {
				            // Lógica para NUEVO (id == 0)
				                System.out.println("Insertando nuevo elemento: " + nombreEl);
				                tipoRiskElementNew.setName(nombreEl);
				                tipoRiskElementNew.setWeight(BigDecimal.valueOf(pesoEle));
				                tipoRiskElementNew.setRiskfactorid(tipoRiskNew);
				                tipoRiskElementNew2=riskfactorelementsService.addIdRiskfactorelements(tipoRiskElementNew);
				            // repository.save(new ElementEntity(nombre, peso));
				             }
				            });
				
				    }																		
					
							
			
				    //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
				     String module = "Factores de Riesgo";
				     //String Descmodule = "Actualización de parametro del Sistema con id: " + parmid  ;
				     String Descmodule = "Se agregó el Tipo de Factor de Riesgo: " + datosrisk.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 {
					
					
					
				    	//tipoCanal = channelsService.getChannelsByid(idparametro);
				    	tipoRisk = riskfactorsService.getRiskfactorsByid(idparametro);
				    			
				    	tipoRisk.setStatus(datosrisk.getStatus());
				    	tipoRisk.setModifiedat(fechaDate);
				    	tipoRisk.setCreatedat(fechaDate); 
				    	//tipoRisk.setName(datosrisk.getName());
				    	tipoRisk.setCategory(datosrisk.getCategory());
				    	tipoRisk.setScenery(datosrisk.getScenery());
						

						String vp1 = tipoRisk.getName();
						String vp2 = datosrisk.getName();
						if (vp1.equals(vp2)){
							String Validausers = "El canal es el mismo";
					    	
						} else {
					
						 String QueryTotal = "SELECT name FROM main.riskfactors WHERE LOWER(name) = " + "'" + datosrisk.getName().toString().toLowerCase() + "'" ;
						 Long validaCanal = (long) jdbcTemplate.queryForList(QueryTotal).size();
						 
		                if (validaCanal>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 {
							tipoRisk.setName(datosrisk.getName());
						}
					}																
					
						final Riskfactors[] riskFactorWrapper = new Riskfactors[1];
						//tipovp2=workersService.addIdWorkers(tipoWorker);
						//tipoRisk2=channelsService.addIdChannels(tipoCanal);
						tipoRisk2 = riskfactorsService.addIdRiskfactors(tipoRisk);
						riskFactorWrapper[0] = riskfactorsService.getRiskfactorsByid(idparametro);
						final Riskfactors riskFactorFinal = tipoRisk;
						if (datosrisk.getElements() == null || datosrisk.getElements().isEmpty()) {
					        String mensaje = "No vienen elementos";
					    } else {
				            Statement sentenciaPreparada = null;

					    	   datosrisk.getElements().forEach(elemento -> {
					    		   int idfactorrisk = 0;
					    		   Riskfactorelements tipoRiskElementNew = new Riskfactorelements();
						            Riskfactorelements tipoRiskElementNew2 = new Riskfactorelements();
					            Integer idele = elemento.getId();
					            String nombreEl = elemento.getName();
					            int pesoEle = elemento.getWeight();
					            if ((idele==0) || (idele<0) ) {
					            	String mensaje = "No hace nada";
					            } else {
					            	  
							            Riskfactorelements objetoanterior = riskfactorelementsRepository.getById(idele);
							             idfactorrisk = objetoanterior.getRiskfactorid().getId();
					            }
					          
					           if (idele > 0) {
					            // Lógica para ACTUALIZAR
					               System.out.println("Actualizando elemento Nombre: " +  nombreEl);

					               String sql = "UPDATE main.riskfactorelements SET " +
					                       "weight = " + BigDecimal.valueOf(pesoEle) + ", " +
					                       "name = '" + nombreEl + "', " +
					                       "riskfactorid = " + idparametro + " " +
					                       "WHERE id = " + idele + " AND riskfactorid = " + idfactorrisk;
					               int filasInsertadas=0;
				    	            try {
										filasInsertadas = sentenciaPreparada.executeUpdate(sql);
									} catch (SQLException e) {
										// TODO Auto-generated catch block
										e.printStackTrace();
									}
					            
					               
				   		          
					             } else if (idele < 0) {
					            // Lógica para BORRAR (se suele usar el valor absoluto del ID)
					            	  System.out.println("Borrando elemento ID: " + Math.abs(idele));
					            	  String nombreEscapado = nombreEl.replace("'", "''");
					            	  Optional<Riskfactorelements> objetopornombrer = riskfactorelementsRepository.getByName(nombreEscapado);
							             idfactorrisk = objetopornombrer.get().getId();
						                // DELETE FROM Riskfactorelements e where e.id = ?1 and e.riskfactorid = ?2
					            	  
						                String sql = " DELETE FROM  main.riskfactorelements " +
							                       " WHERE  id = '" + idfactorrisk;
							               int filasInsertadas=0;
						    	            try {
												filasInsertadas = sentenciaPreparada.executeUpdate(sql);
											} catch (SQLException e) {
												// TODO Auto-generated catch block
												e.printStackTrace();
											}
						            
					              } else {
					            // Lógica para NUEVO (id == 0)
					            	  System.out.println("Insertando nuevo elemento: " + nombreEl);
						                tipoRiskElementNew.setName(nombreEl);
						                tipoRiskElementNew.setWeight(BigDecimal.valueOf(pesoEle));
						                tipoRiskElementNew.setRiskfactorid(riskFactorFinal);
						                tipoRiskElementNew2=riskfactorelementsService.addIdRiskfactorelements(tipoRiskElementNew);
					            // repository.save(new ElementEntity(nombre, peso));
					             }
					            });
					
					    }																		
						
						
					    //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
					     String module = "Factores de Riesgo";
					     //String Descmodule = "Actualización de parametro del Sistema con id: " + parmid  ;
					     String Descmodule = "Se actualizó el Tipo de Factor de Riesgo: "+ datosrisk.getName() + " con Id:" + idparametro ;
					    
				         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 = idparametro;
				 		   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("/riskfactors/categories")
	public ResponseEntity<?> listriskcategories(HttpServletRequest request,@RequestBody UsersListDto tiposfiltros) throws ParseException, UnsupportedEncodingException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		ChannelsRecordDto channelsRecordDto = new ChannelsRecordDto();
		
		
		RiskCategoryResponseDto riskCategoryResponseDto = new RiskCategoryResponseDto();
		List<String> listaCategorias= new ArrayList<>();

	     
	     Long cuantosregistro = (long) 0;
	     
	     List<RiskFactorsRecordDto> listasRecordRisk= new ArrayList<>();
	     TypesUnitDto detalleTypes;
	     TypesUnitDto detallePeriodos;
	     List<TypesUnitDto> listasPeriodos = new ArrayList<>();
		 
		 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();
	       
	        
	     
	       
	      int idrol;
	   	  String searchIn = "";
	   	  String contentIn = "";
	     // String searchModule = "";
		  int searchStatus = 0;
		  int typeIn=0;
		  String fechaComoCadena; 
		 int orderIn = 0;
		 int offsetIn = 0;
		 int numofrecordsIn = 0;
		 Date fecha2 = new Date();
		
			if (sessionid==null) {
				String var = "";
				boolean bloked = false;
				RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
				respuestaDto.setBlocked(bloked);
				respuestaDto.setMsg("Sesión expirada o inválida");
				//Error 400
				return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
			} else   {
				 
				   sessionid = sessionid.substring(7);
				   Optional<Users> encontreSessionUsuario =usersRepository.getBySessionid(sessionid);
	
				   
				   if (encontreSessionUsuario.isPresent()) {
					   
					   Date FechaReg = encontreSessionUsuario.get().getValidthru(); 
					   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);
						   
					    }
					   
					  // Este proceso permite obtener un listado de los proveedores. (Priv 440)
					   Roles roles = encontreSessionUsuario.get().getRolid();
					   idrol = roles.getId();
					   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 800);
					 
					        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);
					        }	
					    
						  searchIn = tiposfiltros.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);
						  }
						 
						       
						   searchIn = usersService.eliminarAcentosService(tiposfiltros.getFilters().getSearch());
						   searchStatus = tiposfiltros.getFilters().getStatus();
					
						  orderIn = tiposfiltros.getOrder();
						  offsetIn = tiposfiltros.getOffset();
						  numofrecordsIn = tiposfiltros.getNumofrecords();
						  contentIn = tiposfiltros.getContent();
						  
						  
						  if (contentIn !=null) {
						     menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());
						  }
						 
					
					
				 } else {
						String var = "";
						boolean bloked = false;
						RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
						respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Sesión expirada o inválida");
						return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
				 }
			}
			
			
		
		try {
			
			String SentenciaBase;
			SentenciaBase = "SELECT u.category FROM main.riskfactors u ";
						
				Query query;
				String groupby = " GROUP BY category ";
				
			String QueryTotal = "";
			String category = "u.category";
			String status = "f.status";				
			String lowername = "main.sinacentos(LOWER(u.category))";
			String lowercategory = "main.sinacentos(LOWER(u.category))";
			String LowerSearch = searchIn.toLowerCase();
			
			 switch (searchIn) { 
			    case "":  // viene sin busqueda por el like
			    	
			    	QueryTotal = SentenciaBase  + " WHERE TRUE = TRUE";
			     break;
			  
			    default:	// viene con el parametro para buscar por el like		
			    	 
			    	   QueryTotal = SentenciaBase + " WHERE " + lowercategory + " LIKE  " + "'%" + LowerSearch + "%'";
			    	   			    	
	         }
			 
			
			    	 QueryTotal = QueryTotal + groupby;
			         query = entityManager.createNativeQuery(QueryTotal);
			         		     			 			 			
			 
			 String ordena="";
			  if (orderIn == 1) {
				  ordena = " ASC";
			 }  else if (orderIn == -1) {
				  ordena = " DESC";
			 } else {
				 	String var2 = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
					respuestaDto= new RespuestaMsgDto("Error interno del servidor");
					estatus=HttpStatus.INTERNAL_SERVER_ERROR;   
					return new ResponseEntity(respuestaDto, estatus);
			 }		
			 int absolutoOrden = Math.abs(orderIn);			 			 			 			 
			 switch (absolutoOrden) { 
			    case 1:  //ordena por name ascendente
			    	
			    	QueryTotal = QueryTotal + " ORDER BY " + category + ordena;
			     break;
			    		
			   }
		
	     			   
				       query = entityManager.createNativeQuery(QueryTotal);
				       query.setFirstResult(offsetIn);
					   query.setMaxResults(numofrecordsIn);
					   List<String> listacompleta = query.getResultList();
				
					   cuantosregistro = (long) query.getResultList().size();				    		
      	    	
		    	//	 RiskCategoryResponseDto riskCategoryResponseDto = new RiskCategoryResponseDto();
		    	//		List<String> listaCategorias= new ArrayList<>();
		    		       riskCategoryResponseDto.setNumofrecords(cuantosregistro); 
					       riskCategoryResponseDto.setSessionvalidthru(fechaComoCadena);
					       riskCategoryResponseDto.setRecords(listacompleta);
		    	   	    	   			
		  						           
                return ResponseEntity.ok(riskCategoryResponseDto);
		     						
			 
	
		} catch (Exception e) {
            // Manejo de excepciones
			respuesta= new RespuestaDto("Error interno del servidor", false);
			estatus=HttpStatus.INTERNAL_SERVER_ERROR;            
        } finally {
	        if (entityManager != null && entityManager.isOpen()) {
	            entityManager.close();
	        }
	    }
		
		return new ResponseEntity(respuesta, estatus);
	
	}
	
	@DeleteMapping("/riskfactors/{riskfactorid}")
	public ResponseEntity<?> borrarRiskFactor(HttpServletRequest request, @PathVariable("riskfactorid") final Integer riskfactorid)
			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, 223);
				   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 (riskfactorsRepository.existsById(riskfactorid)) {
					   					
						    Optional<Riskfactors> FactorDelete = riskfactorsRepository.findById(riskfactorid);
						    Riskfactors FactorDelete2 = riskfactorsRepository.getById(riskfactorid);
						   String module = "Factores de Riesgo";
						     String Descmodule = "Se eliminó el Tipo de Factor de Riesgo: " + FactorDelete2.getName() + " con Id: " + FactorDelete2.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);
					   try {
									//usersRepository.deleteusersbyid(userid,fechaDate,valor);	
						   riskfactorsRepository.delete(FactorDelete2);	   
					 		 respuestaValueDto= new RespuestaValueDto(riskfactorid);

								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);
				
			}

			
		}
		
	}	

}
