package com.dacrt.SBIABackend.controler;
import java.math.BigInteger;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
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 java.util.UUID;

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

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.dao.DataIntegrityViolationException;
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.EvalProccesAppDto;
import com.dacrt.SBIABackend.dto.EvalProccesInputsDto;
import com.dacrt.SBIABackend.dto.EvalProccesRecordDto;
import com.dacrt.SBIABackend.dto.EvalProccesSuppliRecordDto;
import com.dacrt.SBIABackend.dto.EvalProcessRecordsDto;
import com.dacrt.SBIABackend.dto.EvalProcessRequestDto;
import com.dacrt.SBIABackend.dto.EvalProcessResponseDto;
import com.dacrt.SBIABackend.dto.FacilityDto;
import com.dacrt.SBIABackend.dto.OperationlineDto;
import com.dacrt.SBIABackend.dto.ProcessResponDto;
import com.dacrt.SBIABackend.dto.RtoRecordSupplierDto;
import com.dacrt.SBIABackend.dto.StatusDto;
import com.dacrt.SBIABackend.dto.StatusResponseDto;
import com.dacrt.SBIABackend.dto.StrategiesDependencyDetDto;
import com.dacrt.SBIABackend.dto.StrategiesRecordDto;
import com.dacrt.SBIABackend.dto.StrategyDetDto;
import com.dacrt.SBIABackend.dto.TotalsResponseDto;
import com.dacrt.SBIABackend.dto.TypeStrategiDetDto;
import com.dacrt.SBIABackend.dto.TypeUnitDto;
import com.dacrt.SBIABackend.dto.TypesUnitDto;
import com.dacrt.SBIABackend.dto.UnitsResponseDto;
import com.dacrt.SBIABackend.dto.UnitsUsersDto;
import com.dacrt.SBIABackend.dto.requestDto.EvalProcessesAppRequestDto;
import com.dacrt.SBIABackend.dto.requestDto.EvalProcessesInputsRequestDto;
import com.dacrt.SBIABackend.dto.requestDto.EvalProcessesRecordRequestDto;
import com.dacrt.SBIABackend.dto.requestDto.StatusEvalProcessRequestDto;
import com.dacrt.SBIABackend.dto.requestDto.StrategiesRequestDto;
import com.dacrt.SBIABackend.dto.responseDto.ApplicationResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.EstrategiesDetailResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.EvalProcEntryResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.EvalProcInputDetailResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.EvalProcInputEntryResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.EvalProcInputsResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.EvalProcRecordDetailResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.EvalProcessesAppEntryRespondeDto;
import com.dacrt.SBIABackend.dto.responseDto.EvalProcessesRecordResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.EvalProcessesSupplierResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.EvalprocessesResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.StrategiesDetRespondeDto;
import com.dacrt.SBIABackend.entity.Applications;
import com.dacrt.SBIABackend.entity.Evalprocapps;
import com.dacrt.SBIABackend.entity.Evalprocesses;
import com.dacrt.SBIABackend.entity.Evalprocinputs;
import com.dacrt.SBIABackend.entity.Evalprocrecords;
import com.dacrt.SBIABackend.entity.Strategiesdet;
import com.dacrt.SBIABackend.entity.Suppliers;
import com.dacrt.SBIABackend.entity.Unitprocesses;
import com.dacrt.SBIABackend.entity.Units;
import com.dacrt.SBIABackend.entity.Workers;
import com.dacrt.SBIABackend.repository.ApplicationsRepository;
import com.dacrt.SBIABackend.repository.CampaignsRepository;
import com.dacrt.SBIABackend.repository.EvalprocappsRepository;
import com.dacrt.SBIABackend.repository.EvalprocessesRepository;
import com.dacrt.SBIABackend.repository.EvalprocinputsRepository;
import com.dacrt.SBIABackend.repository.EvalprocrecordsRepository;
import com.dacrt.SBIABackend.repository.SuppliersRepository;
import com.dacrt.SBIABackend.repository.UnitprocessesRepository;
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.UsersListDto;
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.utils.HttpReqRespUtils;

@RestController
@CrossOrigin(origins = "*")
public class EvalprocinputsController {
	@Autowired
	private ParamsRepository paramsRepository;
	
	@Autowired
	private UsersRepository usersRepository;
	
	@Autowired
	private AuditRepository auditRepository;
	
	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;
	
	@Autowired
	UsersService usersService;
	
	@Autowired
	ParamsService paramsService;
	
	@Autowired
	SecurityService securityService;
	
	@Autowired
	MenuService menuService;
	
	@Autowired
	ApplicationsRepository applicationsRepository;
	
	@Autowired
	EvalprocrecordsRepository evalprocrecordsRepository;
	
	@Autowired
	EvalprocinputsRepository evalprocinputsRepository;
	
	@Autowired
	UnitprocessesRepository unitprocessesRepository;
	
	@Autowired
	CampaignsRepository campaignsRepository;
	
	@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
	EvalprocessesRepository evalprocessesRepository;
	
	@GetMapping("/evalprocesses/{evalprocessid}/inputs")
   	public ResponseEntity<?> getListUnitsdevalprocesses(HttpServletRequest request, @PathVariable("evalprocessid") final Integer evalprocessid)
   			throws ParseException {
   				RespuestaDto respuesta = new RespuestaDto("", false);
   				HttpStatus estatus = HttpStatus.FORBIDDEN;
   				EvalProcInputsResponseDto evalProcInputsResponseDto = new EvalProcInputsResponseDto();
   			
   				RtoRecordSupplierDto detallerto;
   				RtoRecordSupplierDto detallerpo;
   				
   				EvalProccesSuppliRecordDto detalleEvalProccesSuppliDto;
   				EvalProccesInputsDto detalleEvalRecordDto = null;
   				StrategiesRecordDto detalleRecord=null;
   				StrategyDetDto detalleStrategy;
   				OperationlineDto  detalletype,detalleunit,detalleprocess,detallestatus;
   	    		 
   				TypeStrategiDetDto detalleTypeStrategy;
   			     List<UnitsUsersDto> listasUnits = new ArrayList<>();
   			     List<EvalProccesInputsDto> listEvalProccesRecordDto= new ArrayList<>();
   			     List<UnitsUsersDto> listasProcess = new ArrayList<>();
   			  
   			     Long cuantosregistro = (long) 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);
   			        Date fechaDate = formatter.parse(dataFormattata);
   			        AuditRequestDto  auditDto=new AuditRequestDto();
   			        int idUser;
   			       TypesUnitDto detalleTypesPer;
		    	   TypesUnitDto detalleTypesSca;
		    	   TypesUnitDto detalleTypesApp;
		    	   TypesUnitDto detalleTypesReq;
		    	   EvalProccesRecordDto EvalProccesRecordDto;
		    	   List<TypesUnitDto> listasTypesInputs = new ArrayList<>();
				   List<TypesUnitDto> listasTypesScale = new ArrayList<>();
				   List<TypesUnitDto> listasTypesApp = new ArrayList<>();
				   List<TypesUnitDto> listasTypesRequired = new ArrayList<>();
   			        int rolisvalidDRP;			       
   			        int idrol,searchIdStrategyGeneral,searchUnitid;
   			        OperationlineDto detalleStatysApp = null;
   			   	
   					  
   			     // String searchModule = "";
   				  int searchStatus = 0;
   				  int searchVP,searchFacility,searchType;
   				  String fechaComoCadena;
   				 int orderIn = 0;
   				 int offsetIn = 0;
   				 int numofrecordsIn = 0;
   				 Optional<Params> deSessDuration=paramsRepository.findByParamname("SESSION_DURATION");
   				 String SessionDuration=deSessDuration.get().getValue();
   				 int duracionSession = Integer.parseInt(SessionDuration);
   				 Date fecha2 = new Date();
   				 int idsupplier=0;
   				 int idworker=0;
   				 Optional<Users> encontreSessionUsuario;
   				
   			
   			  if (evalprocessid==0) {
					  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);
					  
				  }
				  
   			  
   					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);
   						   encontreSessionUsuario =usersRepository.getBySessionid(sessionid);
   						   idUser = encontreSessionUsuario.get().getId();
   						   
   						  
   						  
   						   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);
   									//return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
   								   
   							    }
   							   
   							   
   							   // Este proceso permite obtener un listado de las unidades. (Priv 110)
   							   Roles roles = encontreSessionUsuario.get().getRolid();
   							    idrol = roles.getId();
   							   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 200);
   							   //validando privilegio de DRP
   							  //  rolisvalidDRP = auditRepository.getCantbyRolAndPrivi(idrol, 314);
   							   
   							   
   							   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 {
   								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 = " SELECT ei.id idinsumo,ei.name nameinsumo,ei.dsc,pr.valor idtipoinput,pr.descr desctipoinput,u.id idunidad, "
   					+ " u.name nameunidad,p.id idproceso,p.name nameproceso,ep.inputst	FROM main.evalprocesses ep " 
   					//+ " LEFT JOIN main.evalprocinputs ei ON ep.id = ei.evalprocessid "
   					+ " INNER JOIN main.evalprocinputs ei ON ep.id = ei.evalprocessid"
   					+ " LEFT JOIN main.unitprocesses up ON up.id = ei.unitprocessid "
   					+ " LEFT JOIN main.units u ON u.id = up.unitid "
   					+ " LEFT JOIN main.processes p ON p.id = up.processid "
   					+ " 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 = 'INPUT_TYPE') pr ON ei.evalprocinputtypepar = pr.valor "
   					+ "  WHERE ep.id = " + evalprocessid 
   					+ " ORDER BY ei.id ASC";			
   					
   					
   					String queryInputs= " 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 = 'INPUT_TYPE' ";
					
   					 String QueryTotal = "";
   					 QueryTotal = SentenciaBase;
    					
   					 	 
   					 Query query = entityManager.createNativeQuery(QueryTotal);
   					  cuantosregistro = (long) jdbcTemplate.queryForList(QueryTotal).size();
   					       
   					       query = entityManager.createNativeQuery(QueryTotal);
   					     
   					       
   					        int codigoestatusdefault;
					    	String descestatusdefault;
					    	
					    	if (cuantosregistro==0) {
					    		codigoestatusdefault = 0;
					    		descestatusdefault = "Activa";
					    		detalleStatysApp= new  OperationlineDto();
					    		detalleStatysApp.setId(codigoestatusdefault);
					    		detalleStatysApp.setName(descestatusdefault);
					    		
					    		int idestatusevaluacionInputs = evalprocessesRepository.getStatusInputsById(evalprocessid);
					    		 if (idestatusevaluacionInputs==0) {
					    			 codigoestatusdefault = 0;
							    		descestatusdefault = "Activa";
							    		detalleStatysApp= new  OperationlineDto();
							    		detalleStatysApp.setId(codigoestatusdefault);
							    		detalleStatysApp.setName(descestatusdefault);
					    		 } 
					    		 if (idestatusevaluacionInputs==1) {
					    		     	codigoestatusdefault = 1;
							    		descestatusdefault = "Cerrada";
							    		detalleStatysApp= new  OperationlineDto();
							    		detalleStatysApp.setId(codigoestatusdefault);
							    		detalleStatysApp.setName(descestatusdefault);
					    		 } 
					    		
					    	}
					    	
					    	
   						   List<Object[]> listacompleta = query.getResultList();
   					    	listEvalProccesRecordDto= new ArrayList<>();
   						  
   				    		   for (Object[] reg : listacompleta) {
   				    		 
   				    			 detalleEvalRecordDto= new EvalProccesInputsDto();
   				    		 
   				    		   detalletype = new  OperationlineDto();
   				    		   detalleunit = new  OperationlineDto();
   				    		   detalleprocess = new  OperationlineDto();
   				    		 
   				    		   detallerpo = new  RtoRecordSupplierDto();
   				    		   detalleStatysApp= new  OperationlineDto();
   				    		   
   				    		   detalleStatysApp.setId((int) reg[9]);
 				    		   if ((int) reg[9]==1) {
				    			   detalleStatysApp.setName("Cerrada");
				    			   
				    		   } else
				    		   {
				    			   detalleStatysApp.setName("Activa");
				    		   }
				    		   
 				    		    detalleEvalRecordDto.setId((int) reg[0]);
 				    		    detalleEvalRecordDto.setName((String) reg[1]);
 				    		    detalleEvalRecordDto.setDsc((String) reg[2]); 
   				    		    
   				    	  	    
   				    		    String idtypeString = (String) reg[3];
 				    		    Integer valorid1 = Integer.parseInt(idtypeString);
 				    		   
   				    		       detalletype.setId(valorid1);
   				    		       detalletype.setName((String) reg[4]);
   				    		    detalleEvalRecordDto.setType(detalletype);
   				    		    
   				    	        
   				            
   				    	       /////seteo de la unidad
   				    	        
   				    	       // String idunidad = (String) reg[5];
				    		    Integer valoridunidad =  (int) reg[5];
				    		   // detalleunit = new  OperationlineDto();
	   				    		 //  detalleprocess = new  OperationlineDto();
	   				    		 
				    		       detalleunit.setId(valoridunidad);
				    		       detalleunit.setName((String) reg[6]);
				    	         
				    		      
				    		       detalleEvalRecordDto.setUnit(detalleunit);
				    	        ////////////seteo de los procesos////////
				    		       
				    		      // String idprocesos = (String) reg[7];
	 				    		    Integer valoridprocesos = (int) reg[7];
	 				    		    
	 				    		   detalleprocess.setId(valoridprocesos);
	 				    		   detalleprocess.setName((String) reg[8]);
				    		     detalleEvalRecordDto.setProcess(detalleprocess);
   				    		
   				    	
   				    		   
   					    	  
   				    	 	listEvalProccesRecordDto.add(detalleEvalRecordDto);
   				    	   }
   				    		   
   				    		   
   				    		  Query queryInp = entityManager.createNativeQuery(queryInputs);
						       List<Object[]> listainputs= queryInp.getResultList();
						       for (Object[] types : listainputs) {
						    	   detalleTypesPer = new TypesUnitDto();
						    	
						    	   
						    	   detalleTypesPer.setDsc((String) types[0]);
						    	   detalleTypesPer.setValue((String) types[1]);
						    	   listasTypesInputs.add(detalleTypesPer);
						       }
						       						        				    					    					    
						       evalProcInputsResponseDto.setNumofrecords(cuantosregistro);
						       evalProcInputsResponseDto.setSessionvalidthru(fechaComoCadena);
						       evalProcInputsResponseDto.setRecords(listEvalProccesRecordDto);
						       evalProcInputsResponseDto.setStatus(detalleStatysApp);
						       evalProcInputsResponseDto.setInputtype(listasTypesInputs);
   		                return ResponseEntity.ok(evalProcInputsResponseDto);

   				
   		       
   				} 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("/evalprocesses/{evalprocessid}/inputs/{evalprocinpid}")
   	public ResponseEntity<?> getOneUnitsevalprocesses(HttpServletRequest request, @PathVariable("evalprocessid") final Integer evalprocessid,@PathVariable("evalprocinpid") final Integer evalprocinpid)
   			throws ParseException {
   				RespuestaDto respuesta = new RespuestaDto("", false);
   				HttpStatus estatus = HttpStatus.FORBIDDEN;
   				EvalProcInputEntryResponseDto evalProcInputEntryResponseDto = new EvalProcInputEntryResponseDto();
   			
   				RtoRecordSupplierDto detallerto;
   				RtoRecordSupplierDto detallerpo;
   				
   				EvalProccesSuppliRecordDto detalleEvalProccesSuppliDto;
   				EvalProcInputDetailResponseDto detalleEvalInputDto = null;
   				OperationlineDto  detalletype,detalleunit,detalleprocess;
   	    		 
   			   
   			     Long cuantosregistro = (long) 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);
   			        Date fechaDate = formatter.parse(dataFormattata);
   			        AuditRequestDto  auditDto=new AuditRequestDto();
   			        int idUser;
   			       TypesUnitDto detalleTypesPer;
		    	   TypesUnitDto detalleTypesSca;
		    	   TypesUnitDto detalleTypesApp;
		    	   TypesUnitDto detalleTypesReq;
		    	   EvalProccesRecordDto EvalProccesRecordDto;
		    	  
   			        int rolisvalidDRP;			       
   			        int idrol,searchIdStrategyGeneral,searchUnitid;
   			        OperationlineDto detalleStatysApp = null;
   			   	
   					  
   			     // String searchModule = "";
   				  int searchStatus = 0;
   				  int searchVP,searchFacility,searchType;
   				  String fechaComoCadena;
   				 int orderIn = 0;
   				 int offsetIn = 0;
   				 int numofrecordsIn = 0;
   				 Optional<Params> deSessDuration=paramsRepository.findByParamname("SESSION_DURATION");
   				 String SessionDuration=deSessDuration.get().getValue();
   				 int duracionSession = Integer.parseInt(SessionDuration);
   				 Date fecha2 = new Date();
   				 int idsupplier=0;
   				 int idworker=0;
   				 Optional<Users> encontreSessionUsuario;
   				
   			
   			  if (evalprocessid==0) {
					  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);
					  
				  }
				  
   			  
   					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);
   						   encontreSessionUsuario =usersRepository.getBySessionid(sessionid);
   						   idUser = encontreSessionUsuario.get().getId();
   						   
   						  
   						  
   						   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);
   									//return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
   								   
   							    }
   							   
   							   
   							   // Este proceso permite obtener un listado de las unidades. (Priv 110)
   							   Roles roles = encontreSessionUsuario.get().getRolid();
   							    idrol = roles.getId();
   							   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 200);
   							   //validando privilegio de DRP
   							  //  rolisvalidDRP = auditRepository.getCantbyRolAndPrivi(idrol, 314);
   							   
   							   
   							   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 {
   								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 {								

   				 boolean existeInputs =  evalprocinputsRepository.existsById(evalprocinpid);
   				 
   					String SentenciaBase1 = " SELECT ei.id idinsumo,ei.name nameinsumo,ei.dsc,pr.valor idtipoinput,pr.descr desctipoinput,u.id idunidad, "
   					+ " u.name nameunidad,p.id idproceso,p.name nameproceso,ep.inputst	FROM main.evalprocesses ep " 
   					+ " LEFT JOIN main.evalprocinputs ei ON ep.id = ei.evalprocessid "
   					+ " LEFT JOIN main.unitprocesses up ON up.id = ei.unitprocessid "
   					+ " LEFT JOIN main.units u ON u.id = up.unitid "
   					+ " LEFT JOIN main.processes p ON p.id = up.processid "
   					+ " 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 = 'INPUT_TYPE') pr ON ei.evalprocinputtypepar = pr.valor "
   					+ "  WHERE ep.id = " + evalprocessid;
   							
   					
                   String exiteInputCadena =  "  AND ei.id = " + evalprocinpid + " ";
					
					String order =  " ORDER BY ei.id ASC";
					String SentenciaBase="";
					
					
					if (!existeInputs) {
						
						if (evalprocinpid==0) {
							SentenciaBase = SentenciaBase1 + exiteInputCadena + order;
							
						} else
						{
							  String var = "";
								boolean bloked = false;
								RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
								//respuestaDto.setBlocked(bloked);
								respuestaDto.setMsg("Registro no encontrado"); 
								return new ResponseEntity(respuestaDto, HttpStatus.NOT_FOUND);
						}
						
						//SentenciaBase = SentenciaBase1 + order;
					} else {
						SentenciaBase = SentenciaBase1 + exiteInputCadena + order;
						
					}
					
   					 String QueryTotal = "";
   					 QueryTotal = SentenciaBase;
    					
   					 	 
   					 Query query = entityManager.createNativeQuery(QueryTotal);
   					  cuantosregistro = (long) jdbcTemplate.queryForList(QueryTotal).size();
   					       
   					       query = entityManager.createNativeQuery(QueryTotal);
   					

   					 //   EvalProcInputDetailResponseDto detalleEvalInputDto = null;
   		   			//	OperationlineDto  detalletype,detalleunit,detalleprocess;
   		   	    		 
   						   List<Object[]> listacompleta = query.getResultList();
   					   // 	listEvalProccesRecordDto= new ArrayList<>();
   						  
   				    		   for (Object[] reg : listacompleta) {
   				    		 
   				    			detalleEvalInputDto= new EvalProcInputDetailResponseDto();
   				    		 
   				    		   detalletype = new  OperationlineDto();
   				    		   detalleunit = new  OperationlineDto();
   				    		   detalleprocess = new  OperationlineDto();   				    		   				    		   
				    		   
 				    		    detalleEvalInputDto.setId((int) reg[0]);
 				    		    detalleEvalInputDto.setName((String) reg[1]);
 				    		    detalleEvalInputDto.setDsc((String) reg[2]); 
   				    		    
   				    	  	    
   				    		    String idtypeString = (String) reg[3];
 				    		    Integer valorid1 = Integer.parseInt(idtypeString);
 				    		   
   				    		       detalletype.setId(valorid1);
   				    		       detalletype.setName((String) reg[4]);
   				    		    detalleEvalInputDto.setType(detalletype);
   				    		    
   				    	        
   				            
   				    	       /////seteo de la unidad
   				    	        
   				    	       // String idunidad = (String) reg[5];
				    		    Integer valoridunidad =  (int) reg[5];
				    		   // detalleunit = new  OperationlineDto();
	   				    		 //  detalleprocess = new  OperationlineDto();
	   				    		 
				    		       detalleunit.setId(valoridunidad);
				    		       detalleunit.setName((String) reg[6]);
				    	         
				    		      
				    		       detalleEvalInputDto.setUnit(detalleunit);
				    	        ////////////seteo de los procesos////////
				    		       
				    		      // String idprocesos = (String) reg[7];
	 				    		    Integer valoridprocesos = (int) reg[7];
	 				    		    
	 				    		   detalleprocess.setId(valoridprocesos);
	 				    		   detalleprocess.setName((String) reg[8]);
	 				    		  detalleEvalInputDto.setProcess(detalleprocess);
   				    		
   				    	
   				    		   
   					    	  
   				    	 	//listEvalProccesRecordDto.add(detalleEvalRecordDto);
   				    	   }
   				    		   
   				    		   
   				    		  evalProcInputEntryResponseDto.setEntry(detalleEvalInputDto);
   		                   return ResponseEntity.ok(evalProcInputEntryResponseDto);

   				
   		       
   				} 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("/evalprocesses/{evalprocessid}/inputs/{evalprocinpid}")
	 	public ResponseEntity<ParamsResponseDto> UpsertEvalProcessesInputs(HttpServletRequest request,@RequestBody EvalProcessesInputsRequestDto datosEvalProcesses,@PathVariable("evalprocessid") final Integer evalprocessid,@PathVariable("evalprocinpid") final Integer evalprocinpid) throws ParseException {
	 		
	 		
	 		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<>();
	 	         String queryInsertProcesses = "";
	 	         String queryInsertUnidades= "";
	 	         
	 		 int idparametroEval = evalprocessid;
	 		 int idparametroEvalRecord = evalprocinpid;
	 		 
	 		 Optional<Users> encontreSessionUsuario;
	 		 Optional<Evalprocapps> encontreEvalProcessesApp;
	 		 Applications encontreApp;
	 		 
	 		 Evalprocesses encontreEvalProcesses;
	 		 Unitprocesses objUnitProcesses; 
	 		 
	 		 int valor = idparametroEval;
	 		 int valor2 = idparametroEvalRecord;
	 		 int idmensaje=0; 
	 		 String sessionid = request.getHeader("Authorization");
	 		 String queryUpdate;
	 		  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();
	 	        boolean existeRec = false;	       	       	  		
	 		   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   {
	 				
	 				 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);
						 
					  } 
	 				
	 				  if (datosEvalProcesses.getEvalproctypepar()=="") {
	 					  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);
	 					  
	 				  }
	 				  
	 				  if (datosEvalProcesses.getName()=="") {
	 					  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);
	 					  
	 				  }
	 				  
	 				  
	 				  if (datosEvalProcesses.getUnitid()==0) {
	 					  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);
	 					  
	 				  }
	 				  
	 				 if (datosEvalProcesses.getProcessid()==0) {
	 					  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);
	 					  
	 				  }
	 				  
	 				  
	 				  boolean existeEvalidApp =  evalprocessesRepository.existsById(idparametroEval);
					   if (!existeEvalidApp) {
						   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);
				    	  
				       } 		
	 				
	 				 
	 				   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 (idparametroEvalRecord==0) {
	 						   
	 					 	   Roles roles = encontreSessionUsuario.get().getRolid();
	 						   int idrol = roles.getId();
	 						   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol,202);
	 						//   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 {
	 						   
	 						  existeRec =  evalprocinputsRepository.existsById(idparametroEvalRecord);
	 						   if (!existeRec) {
	 					    	    String var = "";
	 								boolean bloked = false;
	 								RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
	 								//respuestaDto.setBlocked(bloked);
	 								respuestaDto.setMsg("Registro no encontrado"); 
	 								return new ResponseEntity(respuestaDto, HttpStatus.NOT_FOUND);
	 					    	  
	 					      } 		
	 					   
	 					   
	 					   Roles roles = encontreSessionUsuario.get().getRolid();
	 					   int idrol = roles.getId();
	 					   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol,201);
	 					  // 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);
	 						   
	 					     }
	 					   } 					   					 											 
	 					    String SalidaName= usersService.verificarCaracteresValidosConRegex(datosEvalProcesses.getName());
						    String SalidaDesc = usersService.verificarCaracteresValidosConRegex(datosEvalProcesses.getDsc());
						   // String SalidaCod = usersService.verificarCaracteresValidosConRegex(datosEvalProcesses.getLocation());
						    
						    if (SalidaName=="NOOK" || SalidaDesc=="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);
							  }  	
	 				   
	 				 } 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 {
	 			String valorParamsStraDepe = "";				
	 			

	  					
	 			if (idparametroEvalRecord==0) {
	 							
	 				Evalprocinputs evalprocInput = new Evalprocinputs();
	 				
	 				
	 				try {
	 					
	 					 // encontreEvalProcessesApp;
	 					  encontreEvalProcesses = evalprocessesRepository.getById(idparametroEval);
	 					  boolean existeuniproce = unitprocessesRepository.existsByUnitidAndProcessid(datosEvalProcesses.getUnitid(),datosEvalProcesses.getProcessid());
	 					  
	 					  if  (existeuniproce) {
		 					  objUnitProcesses = unitprocessesRepository.findByUnitidAndProcessid(datosEvalProcesses.getUnitid(),datosEvalProcesses.getProcessid());

	 						  
	 					  } else {
	 						  
	 						 String var = "";
		 						boolean bloked = false;
		 						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
		 						//respuestaDto.setBlocked(bloked);
		 						respuestaDto.setMsg("Registro no encontrado");
		 						//Error 400
		 						return new ResponseEntity(respuestaDto, HttpStatus.NOT_FOUND);
	 						  
	 					  }
	 					
	 					
	 					 evalprocInput.setEvalprocessid(encontreEvalProcesses);
	 					 evalprocInput.setEvalprocinputtypepar(datosEvalProcesses.getEvalproctypepar());
	 					 evalprocInput.setName(datosEvalProcesses.getName());
	 					 evalprocInput.setDsc(datosEvalProcesses.getDsc());
	 					 evalprocInput.setCreatedat(fechaDate);
	 					 evalprocInput.setModifiedat(fechaDate);
	 					 evalprocInput.setUnitprocessid(objUnitProcesses);
	 					
	 					evalprocinputsRepository.save(evalprocInput);
	 					
	 					int maxiInsertado = evalprocinputsRepository.getMaxRecord();
	 					//int idInsertado =  nuevoinsertado.get().getId();
	 					idmensaje = maxiInsertado;
	 					//Connection conexion = null;
	 					Connection conexion2 = DriverManager.getConnection(conexion,userbd, passbd);
	 					//(PreparedStatement sentenciaPreparada = conexion2.prepareStatement(sql))
	 					Statement sentenciaPreparada = null;
	 					sentenciaPreparada = conexion2.createStatement();
	 					 
	   
	 			         
	 			        //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
	 				     String module = "Evaluación por Procesos";
	 				     String Descmodule = "Se agregó Insumo en Evaluación de Procesos con Id: " + idmensaje;
	 				    
	 			         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);
	                     	
	 			     } catch (Exception e) {
	 			    	 
	 			    		respuesta= new RespuestaMsgDto("Registro duplicado");
	 						estatus=HttpStatus.CONFLICT;
	 						return new ResponseEntity(respuesta, estatus);
	 				
	 			}
	 				
	 		        
	 	         

	 			} else {
	 				
	 				//Strategiesdet strategies = new Strategiesdet();
	 				//Strategiesdet strategies2 = new Strategiesdet();
	 				Evalprocinputs evalprocInput;
	 		
	 				
	 		
	 				try {
	 					
	 					 // encontreEvalProcessesApp;
	 					// encontreEvalProcesses = evalprocessesRepository.getById(idparametroEval);
	 					 // encontreApp = applicationsRepository.getById(datosEvalProcesses.getApplicationid());
	 					evalprocInput = evalprocinputsRepository.getById(valor2);
	 				
	 				    int maxiInsertado = evalprocInput.getId();
	 					
	 				   encontreEvalProcesses = evalprocessesRepository.getById(idparametroEval);
	 					  boolean existeuniproce = unitprocessesRepository.existsByUnitidAndProcessid(datosEvalProcesses.getUnitid(),datosEvalProcesses.getProcessid());
	 					  
	 					  if  (existeuniproce) {
		 					  objUnitProcesses = unitprocessesRepository.findByUnitidAndProcessid(datosEvalProcesses.getUnitid(),datosEvalProcesses.getProcessid());

	 						  
	 					  } else {
	 						  
	 						 String var = "";
		 						boolean bloked = false;
		 						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
		 						//respuestaDto.setBlocked(bloked);
		 						respuestaDto.setMsg("Registro no encontrado");
		 						//Error 400
		 						return new ResponseEntity(respuestaDto, HttpStatus.NOT_FOUND);
	 						  
	 					  }
	 					
	 					
	 					 evalprocInput.setEvalprocessid(encontreEvalProcesses);
	 					 evalprocInput.setEvalprocinputtypepar(datosEvalProcesses.getEvalproctypepar());
	 					 evalprocInput.setName(datosEvalProcesses.getName());
	 					 evalprocInput.setDsc(datosEvalProcesses.getDsc());
	 					 evalprocInput.setCreatedat(fechaDate);
	 					 evalprocInput.setModifiedat(fechaDate);
	 					 evalprocInput.setUnitprocessid(objUnitProcesses);
	 					
	 					evalprocinputsRepository.save(evalprocInput);
	 					//int maxiInsertado = evalprocappsRepository.getMaxRecord();
	 					idmensaje = maxiInsertado;
	 					//Connection conexion = null;
	 					Connection conexion2 = DriverManager.getConnection(conexion,userbd, passbd);
	 					//(PreparedStatement sentenciaPreparada = conexion2.prepareStatement(sql))
	 					Statement sentenciaPreparada = null;
	 					sentenciaPreparada = conexion2.createStatement();
	 					 					            
	 			
	 				  
	 			    //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
	 			     String module = "Evaluación por Procesos";
	 			     //String Descmodule = "Actualización de parametro del Sistema con id: " + parmid  ;
	 			     String Descmodule = "Se actualizó Insumo en Evaluación de Procesos con Id: " + idmensaje;
	 			    
	 		         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///////////////////	
	 		 		   // SE ENVIA LA RESPUESTA QUE PIDE EL SERVICIO
	 		 			//String Resp = idinsertado.toString();
	 					respuestaValueDto= new RespuestaValueDto(idmensaje);
	 					//int parmid = 2;
	 					//respuestaValueDto= new RespuestaValueDto(userid);
	 					estatus=HttpStatus.OK;
	 					return new ResponseEntity(respuestaValueDto, estatus);
	 					
	             
	                  
	                  
	 		   	 }  catch (DataIntegrityViolationException ex) {
			    	    Throwable rootCause = ex.getRootCause();
			    	    String mensajeError = "Error al guardar.";
			    	    HttpStatus estatusError = HttpStatus.CONFLICT;

			    	    if (rootCause instanceof SQLException) {
			    	        SQLException sqlEx = (SQLException) rootCause;
			    	        if (sqlEx.getSQLState() != null && sqlEx.getSQLState().equals("23505")) {
			    	            mensajeError = "Registro Duplicado.";
			    	        } else {
			    	           // mensajeError = "Error de base de datos: " + sqlEx.getMessage();
			    	            mensajeError = "Registro Duplicado: ";
			    	            estatusError = HttpStatus.CONFLICT; // O el estatus que consideres apropiado
			    	            ex.printStackTrace(); // Loguea la excepción para depuración
			    	        }
			    	    } else {
			    	     //   mensajeError = "Registro Duplicado: " + ex.getMessage();
			    	    	 mensajeError = "Registro Duplicado: ";
			    	        estatusError = HttpStatus.CONFLICT; // O el estatus que consideres apropiado
			    	        ex.printStackTrace(); // Loguea la excepción para depuración
			    	    }

			    		respuesta= new RespuestaMsgDto(mensajeError);
						estatus=estatusError;
						return new ResponseEntity(respuesta, estatus);

			} catch (Exception e) {
			    	    respuesta= new RespuestaMsgDto("Error interno del servidor: " + e.getMessage());
						estatus=HttpStatus.INTERNAL_SERVER_ERROR;
						e.printStackTrace(); // Loguea la excepción para depuración
						return new ResponseEntity(respuesta, estatus);
			}
	 		
	 	  }				
	        
	 		}catch (Exception e) {
	             // Manejo de excepciones
	 			respuesta= new RespuestaMsgDto("Error interno del servidor");
	 			estatus=HttpStatus.INTERNAL_SERVER_ERROR;            
	         }
	 		
	 		return new ResponseEntity(respuesta, estatus);
	 	
	 	}
	 
	 
	 @DeleteMapping("/evalprocesses/{evalprocessid}/inputs/{evalprocinpid}")
     public ResponseEntity<?> deleteEvalProcesseRecord(HttpServletRequest request, @PathVariable("evalprocessid") final Integer evalprocessid,@PathVariable("evalprocinpid") final Integer evalprocinpid) throws ParseException {
 		
 		RespuestaValueDto respuestaValueDto;
 		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
 		HttpStatus estatus = HttpStatus.FORBIDDEN;
 		
 	         
 		 int idparametroEval = evalprocessid;
 		 int idparametroEvalRec = evalprocinpid;
 		 
 		 Optional<Users> encontreSessionUsuario;
 		 
 		 Evalprocesses encontreEvalProcesses;
 		 Evalprocesses objectEvalProcesses; 
 		 int valor = idparametroEval;
 		 int valor2 = idparametroEvalRec;
 		 int idmensaje=0; 
 		 String sessionid = request.getHeader("Authorization");
 		 String queryUpdate;
 		  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();
 	        boolean existeApp = false;	       	       	  		
 		   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   {
 				
 				 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);
 				   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,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)
   				    //		 int idparametroEval = evalprocessid;
   					//	 int idparametroEvalApp = evalprocappid;
   					    
   					  boolean existeEvalidPro =  evalprocessesRepository.existsById(idparametroEval);
   					  objectEvalProcesses =  evalprocessesRepository.getById(idparametroEval);
 					   if (!existeEvalidPro) {
 				    	    String var = "";
 							boolean bloked = false;
 							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
 							//respuestaDto.setBlocked(bloked);
 							respuestaDto.setMsg("Registro no encontrado"); 
 							return new ResponseEntity(respuestaDto, HttpStatus.NOT_FOUND);
 				    	  
 				       } 		
 				   
 					   
 						   boolean existeEvalidApp =  evalprocinputsRepository.existsById(idparametroEvalRec);
 						   if (!existeEvalidApp) {
 					    	    String var = "";
 								boolean bloked = false;
 								RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
 								//respuestaDto.setBlocked(bloked);
 								respuestaDto.setMsg("Registro no encontrado"); 
 								return new ResponseEntity(respuestaDto, HttpStatus.NOT_FOUND);
 					    	  
 					       } 		
 					   
 					   Roles roles = encontreSessionUsuario.get().getRolid();
 					   int idrol = roles.getId();
 					   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol,203);
 					   // 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 {
 						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 {
 			

 			        Evalprocinputs evalprocRec;	
 			        //evalprocessid,@PathVariable("evalprocinpid") final Integer evalprocinpid
					//  boolean existeprocessinputs = evalprocinputsRepository.existsByIdAndEvalprocessid(evalprocinpid,objectEvalProcesses.getId());
					  
					 // int existeprocessinputs = evalprocinputsRepository.totalregrelacion(evalprocinpid,evalprocessid);
 			        //select ID from  main.evalprocinputs where id = 11 and evalprocessid = 85
 			       String Query2 = "SELECT id FROM main.evalprocinputs WHERE id = " + evalprocinpid + " " + " AND evalprocessid = " + evalprocessid ;
            	   
				   Long existeprocessinputs = (long) jdbcTemplate.queryForList(Query2).size();
					   
					  if (existeprocessinputs==1) {
						  
						  evalprocinputsRepository.deleteEvalprocInputssbyid(evalprocinpid);
						  
					  } else {
						  
						  String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Registro no encontrado"); 
							return new ResponseEntity(respuestaDto, HttpStatus.NOT_FOUND);				    	  
						  
					  }					  						 						   			        		
  			         
 			        //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
 				     String module = "Evaluación por Procesos";
 				     String Descmodule = "Se Elimino Insumo en Evaluación de Procesos con Id: " + evalprocinpid;
 				    
 			         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(evalprocinpid);
 					
 						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;            
         }
 		
 		return new ResponseEntity(respuesta, estatus);
 	
 	}


}
