package com.dacrt.SBIABackend.controler;

import java.sql.Connection;
import java.sql.DriverManager;
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 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.CoverageAppsRecordDet;
import com.dacrt.SBIABackend.dto.CoverageEntryAppDto;
import com.dacrt.SBIABackend.dto.CoverageEvaluationDto;
import com.dacrt.SBIABackend.dto.CoverageRecordAppDto;
import com.dacrt.SBIABackend.dto.CoverageRecordDet;
import com.dacrt.SBIABackend.dto.EvalProcessRequestDto;
import com.dacrt.SBIABackend.dto.OperationlineDto;
import com.dacrt.SBIABackend.dto.OperationlineDtoStatus2;
import com.dacrt.SBIABackend.dto.ProcessResponDto;
import com.dacrt.SBIABackend.dto.StatusEvalUnitsResponseDto;
import com.dacrt.SBIABackend.dto.TotalPosiResUnitsDto;
import com.dacrt.SBIABackend.dto.TypesUnitDto;
import com.dacrt.SBIABackend.dto.UnitsResponseDto;
import com.dacrt.SBIABackend.dto.requestDto.CoverageAppRequestDto;
import com.dacrt.SBIABackend.dto.requestDto.EvalProcessesInputsRequestDto;
import com.dacrt.SBIABackend.dto.responseDto.CoverageAppsListResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.CoverageAppsResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.CoverageGetOneAppResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.CoverageProcessUnitResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.EvalUnitsResponseDto;
import com.dacrt.SBIABackend.entity.Applications;
import com.dacrt.SBIABackend.entity.Coverageapps;
import com.dacrt.SBIABackend.entity.Coverageappshistory;
import com.dacrt.SBIABackend.entity.Evalprocapps;
import com.dacrt.SBIABackend.entity.Evalprocesses;
import com.dacrt.SBIABackend.entity.Evalprocinputs;
import com.dacrt.SBIABackend.entity.Strategiesdet;
import com.dacrt.SBIABackend.entity.Suppliers;
import com.dacrt.SBIABackend.entity.Unitprocesses;
import com.dacrt.SBIABackend.entity.Workers;
import com.dacrt.SBIABackend.repository.ApplicationsRepository;
import com.dacrt.SBIABackend.repository.CampaignsRepository;
import com.dacrt.SBIABackend.repository.CoverageappsRepository;
import com.dacrt.SBIABackend.repository.CoverageappshistoryRepository;
import com.dacrt.SBIABackend.repository.EvalprocappsRepository;
import com.dacrt.SBIABackend.repository.EvalprocessesRepository;
import com.dacrt.SBIABackend.repository.EvalprosuppliersRepository;
import com.dacrt.SBIABackend.repository.StrategiesdetRepository;
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.RespuestaMsgDto;
import com.dacrt.SBIABackend.security.dto.RespuestaValueDto;
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 CoverageappsController {
	
	@Autowired
	private ParamsRepository paramsRepository;
	
	@Autowired
	private UsersRepository usersRepository;
	
	@Autowired
	private AuditRepository auditRepository;
	
	@Autowired
	private EvalprosuppliersRepository evalprosuppliersRepository;
	
	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;
	
	@Autowired
	UsersService usersService;
	
	@Autowired
	ParamsService paramsService;
	
	@Autowired
	SecurityService securityService;
	
	@Autowired
	MenuService menuService;
	
	@Autowired
	CampaignsRepository campaignsRepository;
	
	@Autowired
	ApplicationsRepository applicationsRepository;
	
	@Autowired
	CoverageappsRepository coverageappsRepository;
	
	@Autowired
	StrategiesdetRepository strategiesdetRepository;
	
	@Autowired
	CoverageappshistoryRepository coverageappshistoryRepository;
	
	@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;
	
	Logger logger = LoggerFactory.getLogger(EvalprocessesController.class);
	
	
	@Transactional
	@PostMapping("/coverageapps")
	public ResponseEntity<EvalUnitsResponseDto> coverApplications(HttpServletRequest request,@RequestBody EvalProcessRequestDto evalProcessRequestDto) throws ParseException {
		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		long cuantosregistro = 0;

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

		String searchIn = "";
		int statusIn = 0;
		int campaingIn=0;

		String searchModule = "";
		String searchUsr = "";
		String contentIn = "";
		int orderIn = 0;
		int offsetIn = 0;
		int numofrecordsIn = 0;
		int rolisvalid = 0;
		 String isSupplier="";
	      String isWorker="";
	      int idsupplier=0;
			 int idworker=0;
			 String isSystem="";

		Optional<Params> deSessDuration = paramsRepository.findByParamname("SESSION_DURATION");
		String SessionDuration = deSessDuration.get().getValue();
		int duracionSession = Integer.parseInt(SessionDuration);
		Date fecha2 = new Date();
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(fecha2); // tuFechaBase es un Date;
		// calendar.add(Calendar.MINUTE, minutosASumar); //minutosASumar es int.
		calendar.add(Calendar.MINUTE, duracionSession); // horasASumar es int.
		// lo que más quieras sumar
		Date ValidThrufechaSalida = calendar.getTime(); // Y ya tienes la fecha sumada.
		SimpleDateFormat salida = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 2024-12-23 23:00
		String fechaComoCadena = salida.format(ValidThrufechaSalida);
		System.out.println(fechaComoCadena);
		
		Long resource= 0L;
		Long positions= 0L;
		String SentenciaInsert = "";
		String SentenciaBase = "";
		// Verifico la session
		if (sessionid == null) {
			respuesta.setMsg("Llamada al servicio malformado");
			estatus = HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		} else {
			sessionid = sessionid.substring(7);
			// verifico si la sesión del usuario existe.
			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
			if (encontreSessionUsuario.isPresent()) { // si la sesión del usuario existe
				Date FechaReg = encontreSessionUsuario.get().getValidthru();
				
				 //// determino el tipo del usuario worker,supplier, system////////
				
				  try { 
					  Workers valorworker =  encontreSessionUsuario.get().getWorkerid();
					  
					     idworker = valorworker.getId();
					 /// String isSupplier="";
				         isWorker="SI";
					  
				     }
				      catch (Exception e) {
					   isWorker="NO";
				     }
				   
				     try { 
						  Suppliers valorsuppliers =  encontreSessionUsuario.get().getSupplierid();
						  
						   idsupplier = valorsuppliers.getId();
						 /// String isSupplier="";
						    isSupplier="SI";
						  
					   }
					   catch (Exception e) {
						    isSupplier="NO";
					   }	
				     
				     if (isSupplier=="NO" && isWorker=="NO") {
				    	 
				    	 isSystem ="SI";
				    	 
				     }
				
				
				//////////////////////fin determinar usuario//////////////////
				
				// Llamada a la funcion que validad el tiempo de Session, retorna la fecha
				// sumandole el tiempo de session activa, y vacio si no esta activa
				fechaComoCadena = securityService.consultarSessionActiva(FechaReg, fecha2,
						encontreSessionUsuario.get().getId());
				
				if (fechaComoCadena == "") {
					RespuestaMsgDto respuestaDto2;
					String var2 = "";
					boolean bloked2 = false;
					respuestaDto2 = new RespuestaMsgDto(var2);
					respuestaDto2.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto2, HttpStatus.UNAUTHORIZED);
				}
				
				// Obtengo el rol de usuario y verifico si corresponde al privilegio del usuario
				rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 350);
				//rolisvalid = 3;
				if (rolisvalid == 0) {
					respuesta.setMsg("No tiene los Privilegios");
					estatus = HttpStatus.FORBIDDEN;
					return new ResponseEntity(respuesta, estatus);
				}
				
				// Obtengo los datos del Body
				searchIn = evalProcessRequestDto.getFilters().getSearch();// dato de busqueda por nombre
				
				 String Salida = usersService.verificarCaracteresValidosConRegex(searchIn);
				  
				  if (Salida=="NOOK") {
					  String var = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						//respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Caracteres no permitidos en la busqueda"); 
						return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
				  }
				statusIn = evalProcessRequestDto.getFilters().getStatus();// dato de busqueda por status
				campaingIn = evalProcessRequestDto.getFilters().getCampaignid();
				
				orderIn = evalProcessRequestDto.getOrder(); // Orden Ascedente o Descendente
				offsetIn = evalProcessRequestDto.getOffset();// Primer registro a mostrar
				numofrecordsIn = evalProcessRequestDto.getNumofrecords();// Número de registros a mostrar
				contentIn = evalProcessRequestDto.getContent();
				// Verifico los Shorcouts
				if (contentIn != null && contentIn != "")
					menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());

				try {
					Query query,query2;
					Integer idUsuario2=encontreSessionUsuario.get().getId();
					//Cantidad de procesos a evaluar																										
				
					cuantosregistro=0;
					
					//SE INSERTA EN LA coverageprocesses los registros que no tengan entrada en dicha tabla, se valida por la clave compuesta :strategiesdetunitid,strategiesdetprocessid
					
					/*String SentenciaInsert = " INSERT INTO main.coverageapps (strategiesdetid,createdat,modifiedat)  "
							+ "							SELECT  ORI.idstrategiesdet,current_timestamp,current_timestamp "
							+ "							FROM "
							+ "					          (SELECT "
							+ "					            ed.id AS idstrategiesdet "
							+ "					           FROM  "
							+ "					             main.strategiesdet ed,main.strategies eg  where ed.applicationid is not null AND ed.strategyid = eg.id and strategytypepar = 2	"
							+ "					           ) AS ORI"
							+ "					         LEFT JOIN "
							+ "					         main.coverageapps AS DES "
							+ "					         ON "
							+ "					         ORI.idstrategiesdet = DES.strategiesdetid  "
							+"  WHERE DES.strategiesdetid IS NULL";*/
					
					if ( isSupplier=="SI") {
					 SentenciaInsert = " INSERT INTO main.coverageapps (strategiesdetid,createdat,modifiedat)   "
							+ "														SELECT  ORI.idstrategiesdet,current_timestamp,current_timestamp  "
							+ "														FROM  "
							+ "												          (SELECT  "
							+ "												            ed.id AS idstrategiesdet  "
							+ "												           FROM   "
							+ "												             main.strategiesdet ed,main.strategies eg,main.users u  WHERE ed.applicationid is not null  "
							+ "                                                        	AND ed.strategyid = eg.id AND eg.strategytypepar = 2 and ed.status=1 and u.id = " + idUsuario2 + " "
							+ "	                                                          AND ed.supplieridusr = u.supplierid "
							+ "												           ) AS ORI "
							+ "												         LEFT JOIN  "
							+ "												         main.coverageapps AS DES  "
							+ "												         ON  "
							+ "												         ORI.idstrategiesdet = DES.strategiesdetid   "
							+ "							 WHERE DES.strategiesdetid IS NULL";
					} else {
						 SentenciaInsert = " INSERT INTO main.coverageapps (strategiesdetid,createdat,modifiedat)   "
								+ "	SELECT  ORI.idstrategiesdet,current_timestamp,current_timestamp  "
								+ "	FROM  "
								+ "		 (SELECT  "
								+ "	ed.id AS idstrategiesdet  "
								+ "	FROM  "
								+ "	 main.strategiesdet ed,main.strategies eg  WHERE ed.applicationid is not null  "
								+ "     AND ed.strategyid = eg.id AND eg.strategytypepar = 2 and ed.status=1 "
								+ "	 ) AS ORI "
								+ "	 LEFT JOIN  "
								+ "	 main.coverageapps AS DES  "
								+ "	ON  "
								+ "	 ORI.idstrategiesdet = DES.strategiesdetid   "
								+ "	WHERE DES.strategiesdetid IS NULL";
					}
					
					
					System.out.println(SentenciaInsert);
					query2 = entityManager.createNativeQuery(SentenciaInsert);
					//query2.setParameter("idUsuario", idUsuario2);
					int cuantosregistro2 = query2.executeUpdate();
					
					//Luego query de consulta
					
					
					String QueryTotal="";
					String LowerSearch = searchIn.toLowerCase(); // se convierte en minúscula
					
		if ( isSupplier=="SI") {		
		    SentenciaBase  = " SELECT  e.id isstrategiesdet,ap.name AS app,ap.id AS idapp,  "
				+ "				 	   e.name namestra,cov.estatus, CAST(coalesce(cov.eval,0) AS integer),cov.id idcover,e.status   "
				+ "				 				 FROM main.strategiesdet e 	  "
				//+ "				-- 				 JOIN main.strategies eg ON e.strategyid = eg.id    "
				+ "				                  JOIN main.applications ap ON e.applicationid  = ap.id  "
				+ "	                              join main.users u ON   e.supplieridusr =u.supplierid     "
				+ "				 				  JOIN (SELECT CASE WHEN tot.eval = tot.totalestatus THEN TRUE ELSE FALSE END AS estatus,   "
				+ "				 				 tot.eval,tot.coverageappid,cover.strategiesdetid,cover.id   "
				+ "				 				 FROM (SELECT COUNT(1) AS eval,(SELECT COUNT(ch2.status)   "
				+ "				 				   FROM main.coverageappshistory ch2   "
				+ "				 				   WHERE ch2.status = 1 AND ch2.coverageappid = ch.coverageappid) AS totalestatus,   "
				+ "				 				  ch.coverageappid  FROM main.coverageappshistory ch GROUP BY ch.coverageappid) AS tot   "
				+ "				 				    RIGHT JOIN (SELECT cp.strategiesdetid,cp.id   "
				+ "				 				        FROM main.coverageapps cp   "
				+ "				 				        LEFT JOIN main.coverageappshistory ch ON ch.coverageappid = cp.id   "
				+ "				 				        GROUP BY cp.strategiesdetid,cp.id   "
				+ "				 				        ) AS cover ON tot.coverageappid = cover.id   "
				+ "				 				    ) AS cov ON cov.strategiesdetid = e.id "
				+ "	  where u.id = " + idUsuario2;
		} else
		{
			
			  SentenciaBase  = " SELECT  e.id isstrategiesdet,ap.name AS app,ap.id AS idapp,  "
						+ "				 	   e.name namestra,cov.estatus, CAST(coalesce(cov.eval,0) AS integer),cov.id idcover,e.status   "
						+ "				 				 FROM main.strategiesdet e 	  "
						//+ "				-- 				 JOIN main.strategies eg ON e.strategyid = eg.id    "
						+ "				                  JOIN main.applications ap ON e.applicationid  = ap.id  "
						//+ "	                              join main.users u ON   e.supplieridusr =u.supplierid     "
						+ "				 				  JOIN (SELECT CASE WHEN tot.eval = tot.totalestatus THEN TRUE ELSE FALSE END AS estatus,   "
						+ "				 				 tot.eval,tot.coverageappid,cover.strategiesdetid,cover.id   "
						+ "				 				 FROM (SELECT COUNT(1) AS eval,(SELECT COUNT(ch2.status)   "
						+ "				 				   FROM main.coverageappshistory ch2   "
						+ "				 				   WHERE ch2.status = 1 AND ch2.coverageappid = ch.coverageappid) AS totalestatus,   "
						+ "				 				  ch.coverageappid  FROM main.coverageappshistory ch GROUP BY ch.coverageappid) AS tot   "
						+ "				 				    RIGHT JOIN (SELECT cp.strategiesdetid,cp.id   "
						+ "				 				        FROM main.coverageapps cp   "
						+ "				 				        LEFT JOIN main.coverageappshistory ch ON ch.coverageappid = cp.id   "
						+ "				 				        GROUP BY cp.strategiesdetid,cp.id   "
						+ "				 				        ) AS cover ON tot.coverageappid = cover.id   "
						+ "				 				    ) AS cov ON cov.strategiesdetid = e.id "
						+ "	  where 1 = 1";
		}
					 	//	+ "	group by e.id,ep.id ,e.strategydetid,uu.unitid,u.name,p.name ,p.id,eg.name,cov.estatus,cov.eval,cov.id" ;
					
					if (searchIn!=null) {
						switch (searchIn) {
							case "":
								QueryTotal = SentenciaBase + " AND 1=1 ";
								break;
							default: // viene con el parametro para buscar por el like
								QueryTotal = SentenciaBase + " AND ( lower(ap.name) LIKE  " + "'%" + LowerSearch + "%'" +  " OR lower(e.name) LIKE  " + "'%" + LowerSearch + "%'" + " ) "  ;
								break;
						}
					}else {
						 respuesta.setMsg("Llamada al servicio malformado");
						 estatus = HttpStatus.BAD_REQUEST;
						 return new ResponseEntity(respuesta, estatus);
				 	 }

					
						switch (statusIn) {
							case 0:
								QueryTotal = QueryTotal + " AND 1=1 ";
								break;
							case 1:
								QueryTotal = QueryTotal + " AND estatus =  true";
								break;
							case 2:
								QueryTotal = QueryTotal + " AND estatus =  false ";
								break;
							default:
								respuesta.setMsg("Llamada al servicio malformado");
								estatus = HttpStatus.BAD_REQUEST;
								return new ResponseEntity(respuesta, estatus);
						 }
					
					
					switch (orderIn) {
						case 1: // ordena por nombre de unidad
							QueryTotal = QueryTotal + " ORDER BY ap.name ASC ";
							break;
	
						case 2:// ordena por nombre de proceso
							QueryTotal = QueryTotal + " ORDER BY e.name ASC ";
							break;												
	
						case -1: // ordena por nombre de unidad
							QueryTotal = QueryTotal + " ORDER BY ap.name DESC  ";
							break;
	
						case -2:// ordena por nombre de proceso
							QueryTotal = QueryTotal + " ORDER BY e.name DESC ";
							break;					
	
						default:
							respuesta.setMsg("Llamada al servicio mal formado");
							estatus = HttpStatus.BAD_REQUEST;
							return new ResponseEntity(respuesta, estatus);
					}
					
					query = entityManager.createNativeQuery(QueryTotal);
					//query.setParameter("idUsuario", idUsuario2);
					cuantosregistro = (long) query.getResultList().size();
					query.setFirstResult(offsetIn);
					query.setMaxResults(numofrecordsIn);
					List<Object[]> resultados = query.getResultList();
					
				
					
					CoverageAppsRecordDet coverageAppsRecordDet = new CoverageAppsRecordDet();
					CoverageAppsResponseDto coverageAppsResponseDto = new CoverageAppsResponseDto();
					CoverageEvaluationDto  coverageEvaluationDto = new CoverageEvaluationDto();
					List<CoverageAppsRecordDet> listRecord = new ArrayList<>();
					
					
					
					OperationlineDto operationDtoApp = new OperationlineDto();
					OperationlineDto operationDtoStr = new OperationlineDto();
					OperationlineDtoStatus2 operationDtoStr2 = new OperationlineDtoStatus2();
					
					StatusEvalUnitsResponseDto statusResponseDto= new StatusEvalUnitsResponseDto();
					PrivilegesAllDto detallePrivilege = new PrivilegesAllDto();
					
					
					
					if (cuantosregistro > 0) {
						for (Object[] fila : resultados) {
							
							coverageAppsRecordDet.setId((int) fila[6]);
							//seteando la App
							
							operationDtoApp.setId((int) fila[2]);
							operationDtoApp.setName((String) fila[1]);
							
							coverageAppsRecordDet.setApplication(operationDtoApp);
						
							
							// seteando la estrategia
							
							operationDtoStr2.setId((int) fila[0]);
							operationDtoStr2.setName((String) fila[3]);
							operationDtoStr2.setStatus((int) fila[7]);
							
							coverageAppsRecordDet.setStrategydet(operationDtoStr2);
							
							//seteando los datos de la evaluacion
							
							coverageEvaluationDto.setCnt((int) fila[5]);
							coverageEvaluationDto.setCompleted((boolean) fila[4]);
							coverageAppsRecordDet.setEvaluations(coverageEvaluationDto);																			
							
							listRecord.add(coverageAppsRecordDet);												
							statusResponseDto= new StatusEvalUnitsResponseDto();
							
							coverageAppsRecordDet = new CoverageAppsRecordDet();
							//coverageProcessUnitResponseDto = new CoverageProcessUnitResponseDto();
							coverageEvaluationDto = new CoverageEvaluationDto();
							operationDtoApp = new OperationlineDto();
							// operationDtoPro = new OperationlineDto();
							 operationDtoStr = new OperationlineDto();
							 operationDtoStr2 = new OperationlineDtoStatus2();
						}
															
						
						rolisvalid=0;
						detallePrivilege = new PrivilegesAllDto();
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 351);
						if (rolisvalid>0)
							detallePrivilege.setUpdate(true);
						else
							detallePrivilege.setUpdate(false);

						rolisvalid=0;
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 350);
						if (rolisvalid>0)
							detallePrivilege.setView(true);
						else
							detallePrivilege.setView(false);

						rolisvalid=0;
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 352);
						if (rolisvalid>0)
							detallePrivilege.setAdd(true);
						else
							detallePrivilege.setAdd(false);

						rolisvalid=0;
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 353);
						if (rolisvalid>0)
							detallePrivilege.setDelete(true);
						else
							detallePrivilege.setDelete(false);
						
						coverageAppsResponseDto.setNumofrecords(cuantosregistro);
						coverageAppsResponseDto.setRecords(listRecord);
						coverageAppsResponseDto.setSessionvalidthru(fechaComoCadena);
						//evalUnitsResponseDto.setTotals(totalsResponseDto);
						coverageAppsResponseDto.setPrivileges(detallePrivilege);
						
						
					}else {
						rolisvalid=0;
						detallePrivilege = new PrivilegesAllDto();
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 351);
						if (rolisvalid>0)
							detallePrivilege.setUpdate(true);
						else
							detallePrivilege.setUpdate(false);

						rolisvalid=0;
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 350);
						if (rolisvalid>0)
							detallePrivilege.setView(true);
						else
							detallePrivilege.setView(false);

						rolisvalid=0;
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 352);
						if (rolisvalid>0)
							detallePrivilege.setAdd(true);
						else
							detallePrivilege.setAdd(false);

						rolisvalid=0;
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 353);
						if (rolisvalid>0)
							detallePrivilege.setDelete(true);
						else
							detallePrivilege.setDelete(false);
						
						coverageAppsResponseDto.setNumofrecords(cuantosregistro);
						coverageAppsResponseDto.setRecords(listRecord);
						coverageAppsResponseDto.setSessionvalidthru(fechaComoCadena);
						//evalUnitsResponseDto.setTotals(totalsResponseDto);
						coverageAppsResponseDto.setPrivileges(detallePrivilege);
					
					}
						
						return new ResponseEntity(coverageAppsResponseDto, HttpStatus.OK);
				}catch(Exception e) {
					respuesta.setMsg("Error interno del servidor " + e.getMessage());
					estatus = HttpStatus.INTERNAL_SERVER_ERROR;
				}
				finally {
			        if (entityManager != null && entityManager.isOpen()) {
			            entityManager.close();
			        }
			    }
			} else { // Si la sesión que viene es inválida
				respuesta.setMsg("Sesión expirada o inválida");
				estatus = HttpStatus.BAD_REQUEST;
				return new ResponseEntity(respuesta, estatus);
			}
			return new ResponseEntity(respuesta, estatus);
		}
	}

	//coverageapps/coverageappid/history/coverageappshistoryid
	
	@Transactional
	@GetMapping("/coverageapps/{coverageappid}/history/{coverageappshistoryid}")
	public ResponseEntity<?> GetOnecoverAppHistory(HttpServletRequest request,@PathVariable("coverageappid") final Integer coverageappid,@PathVariable("coverageappshistoryid") final Integer coverageappshistoryid) 
			throws ParseException {
		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		long cuantosregistro = 0;

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

		String searchIn = "";
		int statusIn = 0;
		int campaingIn=0;

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

		Optional<Params> deSessDuration = paramsRepository.findByParamname("SESSION_DURATION");
		String SessionDuration = deSessDuration.get().getValue();
		int duracionSession = Integer.parseInt(SessionDuration);
		Date fecha2 = new Date();
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(fecha2); // tuFechaBase es un Date;
		// calendar.add(Calendar.MINUTE, minutosASumar); //minutosASumar es int.
		calendar.add(Calendar.MINUTE, duracionSession); // horasASumar es int.
		// lo que más quieras sumar
		Date ValidThrufechaSalida = calendar.getTime(); // Y ya tienes la fecha sumada.
		SimpleDateFormat salida = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 2024-12-23 23:00
		String fechaComoCadena = salida.format(ValidThrufechaSalida);
		System.out.println(fechaComoCadena);
		
		Long resource= 0L;
		Long positions= 0L;
		
		// Verifico la session
		if (sessionid == null) {
			respuesta.setMsg("Llamada al servicio malformado");
			estatus = HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		} else {
			sessionid = sessionid.substring(7);
			// verifico si la sesión del usuario existe.
			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
			if (encontreSessionUsuario.isPresent()) { // si la sesión del usuario existe
				Date FechaReg = encontreSessionUsuario.get().getValidthru();
				// Llamada a la funcion que validad el tiempo de Session, retorna la fecha
				// sumandole el tiempo de session activa, y vacio si no esta activa
				fechaComoCadena = securityService.consultarSessionActiva(FechaReg, fecha2,
						encontreSessionUsuario.get().getId());
				
				if (fechaComoCadena == "") {
					RespuestaMsgDto respuestaDto2;
					String var2 = "";
					boolean bloked2 = false;
					respuestaDto2 = new RespuestaMsgDto(var2);
					respuestaDto2.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto2, HttpStatus.UNAUTHORIZED);
				}
				
				// Obtengo el rol de usuario y verifico si corresponde al privilegio del usuario
				rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 340);
				//rolisvalid = 3;
				if (rolisvalid == 0) {
					respuesta.setMsg("No tiene los Privilegios");
					estatus = HttpStatus.FORBIDDEN;
					return new ResponseEntity(respuesta, estatus);
				}
				
			
				
				
				// Verifico los Shorcouts
				if (contentIn != null && contentIn != "")
					menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());

				try {
					Query query,query2;
					Integer idUsuario2=encontreSessionUsuario.get().getId();
					//Cantidad de procesos a evaluar																										
				
					
					String QueryTotal="";
					
					
		String SentenciaBase  = "SELECT ch.id,ch.date,pr.descr desstate,CAST(pr.valor AS INTEGER) idstate,pr2.descr desclevel,CAST(pr2.valor AS INTEGER) idlevel, "
				+ "	ch.status,ch.dsc, CASE " 
				+ "								WHEN ch.status = 1 THEN 'Completado' "
				+ "								ELSE 'En Progreso' "
				+ "								END AS descestatus    from main.coverageapps ca	"
				+ " JOIN  main.coverageappshistory ch on ca.id = ch.coverageappid "
				+ " 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 = 'COVERAGE_STATE' ) pr ON ch.coveragestatepar = CAST(pr.valor AS integer) "
				+ " 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 = 'COVERAGE_LEVEL' ) pr2 ON ch.coveragelevelpar = CAST(pr2.valor AS integer) "
				+ " WHERE ca.id = " + coverageappid + "  AND ch.id = " + coverageappshistoryid;
					 	//	+ "	group by e.id,ep.id ,e.strategydetid,uu.unitid,u.name,p.name ,p.id,eg.name,cov.estatus,cov.eval,cov.id" ;
				

	            String SetenciaTypes= "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 = 'COVERAGE_STATE' ORDER BY valor ASC";
	            
	            TypesUnitDto detalleTypesstate = new TypesUnitDto();
	            TypesUnitDto detalleTypelevel = new TypesUnitDto();
	            List<TypesUnitDto> listasTypesstate = new ArrayList<>();
	            List<TypesUnitDto> listasTypeslevel = new ArrayList<>();
	            
	            Query queryTypesstate = entityManager.createNativeQuery(SetenciaTypes);
			       List<Object[]> listatipostate= queryTypesstate.getResultList();
			       for (Object[] types : listatipostate) {
			    	   detalleTypesstate = new TypesUnitDto();
			    	  
			    	   detalleTypesstate.setDsc((String) types[0]);
			    	   detalleTypesstate.setValue((String) types[1]);
			    	   listasTypesstate.add(detalleTypesstate);
			       }
			       
	      

	            String SetenciaTypesLevel= "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 = 'COVERAGE_LEVEL' ORDER BY valor ASC";
	            
	            Query queryTypeslevel = entityManager.createNativeQuery(SetenciaTypesLevel);
			       List<Object[]> listatiposlevel= queryTypeslevel.getResultList();
			       for (Object[] types : listatiposlevel) {
			    	   detalleTypelevel = new TypesUnitDto();
			    	  
			    	   detalleTypelevel.setDsc((String) types[0]);
			    	   detalleTypelevel.setValue((String) types[1]);
			    	   listasTypeslevel.add(detalleTypelevel);
			       }
			       
				
		  //  QueryTotal = SentenciaBase + " ORDER BY ch.date DESC ";		
					
	 
					
					//query = entityManager.createNativeQuery(QueryTotal);
			       //SentenciaBase
			        query = entityManager.createNativeQuery(SentenciaBase);
					cuantosregistro = (long) query.getResultList().size();
					query.setFirstResult(offsetIn);
					query.setMaxResults(numofrecordsIn);
					List<Object[]> resultados = query.getResultList();
					
				
					
					CoverageEntryAppDto coverageEntryAppDto = new CoverageEntryAppDto();
					CoverageGetOneAppResponseDto coverageGetOneAppResponseDto = new CoverageGetOneAppResponseDto();
					CoverageEvaluationDto  coverageEvaluationDto = new CoverageEvaluationDto();
					
					
					
					TotalPosiResUnitsDto statusPosiResour = new TotalPosiResUnitsDto();
					OperationlineDto operationDtoCov = new OperationlineDto();
					OperationlineDto operationDtoState = new OperationlineDto();
					OperationlineDto operationDtoStatus = new OperationlineDto();
					
					
					
					if (cuantosregistro > 0) {
						for (Object[] fila : resultados) {
							
							coverageEntryAppDto.setId((int) fila[0]);
							coverageEntryAppDto.setDate((Date) fila[1]);
							//seteando el state
							
							//int IdState = (String) fila[6].
							//operationDtoState.setId((int) fila[6]);
							operationDtoState.setId((int) fila[3]);
							operationDtoState.setName((String) fila[2]);
							
							coverageEntryAppDto.setState(operationDtoState);
							
							
							//seteando el estatus
							
							operationDtoStatus.setId((int) fila[6]);
							operationDtoStatus.setName((String) fila[8]);
							
							coverageEntryAppDto.setStatus(operationDtoStatus);
							
							//seteando el coverage
							
							operationDtoCov.setId((int) fila[5]);
							operationDtoCov.setName((String) fila[4]);
						
							coverageEntryAppDto.setCoverage(operationDtoCov);
							
							// seteando la desc
							coverageEntryAppDto.setDsc((String) fila[7]);
							
						
							/*//listRecord.add(coverageRecordAppDto);												
							statusResponseDto= new StatusEvalUnitsResponseDto();																												
							coverageRecordAppDto = new CoverageRecordAppDto();
							//coverageProcessUnitResponseDto = new CoverageProcessUnitResponseDto();
							coverageEvaluationDto = new CoverageEvaluationDto();
				
							operationDtoStatus = new OperationlineDto();
							operationDtoCov = new OperationlineDto();
							operationDtoState = new OperationlineDto();
							// operationDtoPro = new OperationlineDto();*/
							 
							 
								
						}
															
						coverageGetOneAppResponseDto.setEntry(coverageEntryAppDto);
						coverageGetOneAppResponseDto.setLevels(listasTypeslevel);
						coverageGetOneAppResponseDto.setStates(listasTypesstate);
					
						
						return new ResponseEntity(coverageGetOneAppResponseDto, HttpStatus.OK);
						
						
					} 
						
						else {
							
							coverageGetOneAppResponseDto.setEntry(coverageEntryAppDto);
							coverageGetOneAppResponseDto.setLevels(listasTypeslevel);
							coverageGetOneAppResponseDto.setStates(listasTypesstate);
							return new ResponseEntity(coverageGetOneAppResponseDto, HttpStatus.OK);
							
						}		
						
				}catch(Exception e) {
					respuesta.setMsg("Error interno del servidor " + e.getMessage());
					estatus = HttpStatus.INTERNAL_SERVER_ERROR;
				}
				finally {
			        if (entityManager != null && entityManager.isOpen()) {
			            entityManager.close();
			        }
			    }
			} else { // Si la sesión que viene es inválida
				respuesta.setMsg("Sesión expirada o inválida");
				estatus = HttpStatus.BAD_REQUEST;
				return new ResponseEntity(respuesta, estatus);
			}
			return new ResponseEntity(respuesta, estatus);
		}
	}
	
	@Transactional
	@GetMapping("/coverageapps/{coverageappid}/history")
	public ResponseEntity<?> coverAppHistory(HttpServletRequest request,@PathVariable("coverageappid") final Integer coverageappid) 
			throws ParseException {
		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		long cuantosregistro = 0;

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

		String searchIn = "";
		int statusIn = 0;
		int campaingIn=0;

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

		Optional<Params> deSessDuration = paramsRepository.findByParamname("SESSION_DURATION");
		String SessionDuration = deSessDuration.get().getValue();
		int duracionSession = Integer.parseInt(SessionDuration);
		Date fecha2 = new Date();
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(fecha2); // tuFechaBase es un Date;
		// calendar.add(Calendar.MINUTE, minutosASumar); //minutosASumar es int.
		calendar.add(Calendar.MINUTE, duracionSession); // horasASumar es int.
		// lo que más quieras sumar
		Date ValidThrufechaSalida = calendar.getTime(); // Y ya tienes la fecha sumada.
		SimpleDateFormat salida = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 2024-12-23 23:00
		String fechaComoCadena = salida.format(ValidThrufechaSalida);
		System.out.println(fechaComoCadena);
		
		Long resource= 0L;
		Long positions= 0L;
		
		// Verifico la session
		if (sessionid == null) {
			respuesta.setMsg("Llamada al servicio malformado");
			estatus = HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		} else {
			sessionid = sessionid.substring(7);
			// verifico si la sesión del usuario existe.
			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
			if (encontreSessionUsuario.isPresent()) { // si la sesión del usuario existe
				Date FechaReg = encontreSessionUsuario.get().getValidthru();
				// Llamada a la funcion que validad el tiempo de Session, retorna la fecha
				// sumandole el tiempo de session activa, y vacio si no esta activa
				fechaComoCadena = securityService.consultarSessionActiva(FechaReg, fecha2,
						encontreSessionUsuario.get().getId());
				
				if (fechaComoCadena == "") {
					RespuestaMsgDto respuestaDto2;
					String var2 = "";
					boolean bloked2 = false;
					respuestaDto2 = new RespuestaMsgDto(var2);
					respuestaDto2.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto2, HttpStatus.UNAUTHORIZED);
				}
				
				// Obtengo el rol de usuario y verifico si corresponde al privilegio del usuario
				rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 350);
				//rolisvalid = 3;
				if (rolisvalid == 0) {
					respuesta.setMsg("No tiene los Privilegios");
					estatus = HttpStatus.FORBIDDEN;
					return new ResponseEntity(respuesta, estatus);
				}
				
			
				
				
				// Verifico los Shorcouts
				if (contentIn != null && contentIn != "")
					menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());

				try {
					Query query,query2;
					Integer idUsuario2=encontreSessionUsuario.get().getId();
					//Cantidad de procesos a evaluar																										
				
					cuantosregistro=0;
					
					//SE INSERTA EN LA coverageprocesses los registros que no tengan entrada en dicha tabla, se valida por la clave compuesta :strategiesdetunitid,strategiesdetprocessid
			
					
					String QueryTotal="";
				
					String SentenciaBase  = " SELECT ap.id AS idapp,ap.name AS nameapp,ed.id AS idstra,ed.name AS namestra,ch.date,pr.descr AS descstate,CAST(pr.valor AS INTEGER) AS valorstate, "
							+ " pr2.descr AS desclevel,CAST(pr2.valor AS INTEGER) AS valorlevel,ch.status,ch.dsc, "
							+ " CASE "
							+ "        WHEN ch.status = 1 THEN 'Completado' "
							+ "        ELSE 'En Progreso' "
							+ "    END AS descestatus, "
							+ "    ch.id AS idhistory,ed.status statusestra "
							+ " FROM main.strategiesdet ed "
							+ " JOIN main.applications ap ON ed.applicationid = ap.id "
							+ " LEFT JOIN main.coverageapps ca ON ed.id = ca.strategiesdetid "
							+ " LEFT JOIN main.coverageappshistory ch ON ca.id = ch.coverageappid "
							+ " 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 = 'COVERAGE_STATE' "
							+ " ) pr ON ch.coveragestatepar = CAST(pr.valor AS integer)"
							+ " 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 = 'COVERAGE_LEVEL' "
							+ " ) pr2 ON ch.coveragelevelpar = CAST(pr2.valor AS integer) "
							+ " WHERE ca.id = " + coverageappid;								
					
				
		QueryTotal = SentenciaBase + " ORDER BY ch.date DESC ";		
					
	 
					
					query = entityManager.createNativeQuery(QueryTotal);
					//query.setParameter("idUsuario", idUsuario2);
					cuantosregistro = (long) query.getResultList().size();
					query.setFirstResult(offsetIn);
					query.setMaxResults(numofrecordsIn);
					List<Object[]> resultados = query.getResultList();
					
				
					
					CoverageRecordAppDto coverageRecordAppDto = new CoverageRecordAppDto();
					CoverageAppsListResponseDto coverageAppsListResponseDto = new CoverageAppsListResponseDto();
					CoverageEvaluationDto  coverageEvaluationDto = new CoverageEvaluationDto();
					List<CoverageRecordAppDto> listRecord = new ArrayList<>();
					
					
					UnitsResponseDto unitsResponseDto = new UnitsResponseDto();
					TotalPosiResUnitsDto statusPosiResour = new TotalPosiResUnitsDto();
					OperationlineDto operationDtoApp = new OperationlineDto();
					OperationlineDto operationDtoCov = new OperationlineDto();
					OperationlineDto operationDtoStr = new OperationlineDto();
					OperationlineDtoStatus2 operationDtoStr2 = new OperationlineDtoStatus2();
					OperationlineDto operationDtoState = new OperationlineDto();
					OperationlineDto operationDtoStatus = new OperationlineDto();
					
					ProcessResponDto processResponDto = new ProcessResponDto();
					StatusEvalUnitsResponseDto statusResponseDto= new StatusEvalUnitsResponseDto();
					PrivilegesAllDto detallePrivilege = new PrivilegesAllDto();
					TotalPosiResUnitsDto totalsResponseDto = new TotalPosiResUnitsDto();
					
					Integer contador=0;
					Integer contadorPosition=0;
					Integer contadorResource=0;
					String nohayreg ="SI";
					
					if (cuantosregistro==1) {
				     	try {
				     		for (Object[] fila1 : resultados) {
				     		 int idvalid = (int) fila1[12];
				     		}
				     	} catch(Exception e) { 
				     		 nohayreg ="NO";
				      	}
					}
					
					
					if (nohayreg!="NO") {
						
						for (Object[] fila : resultados) {
							operationDtoApp = new OperationlineDto();
							operationDtoStr = new OperationlineDto();
							operationDtoStr2 = new OperationlineDtoStatus2();
							
							coverageRecordAppDto.setDate((Date) fila[4]);
							//seteando el state
							
							//int IdState = (String) fila[6].
							//operationDtoState.setId((int) fila[6]);
							coverageRecordAppDto.setId((int) fila[12]);
							operationDtoState.setId((int) fila[6]);
							operationDtoState.setName((String) fila[5]);
							
							coverageRecordAppDto.setState(operationDtoState);
							
							//seteando el estatus
							
							operationDtoStatus.setId((int) fila[9]);
							operationDtoStatus.setName((String) fila[11]);
							
							coverageRecordAppDto.setStatus(operationDtoStatus);
							
							//seteando el coverage
							
							operationDtoCov.setId((int) fila[8]);
							operationDtoCov.setName((String) fila[7]);
						
							coverageRecordAppDto.setCoverage(operationDtoCov);
							
							// seteando la desc
							coverageRecordAppDto.setDsc((String) fila[10]);
							
						
							listRecord.add(coverageRecordAppDto);												
							statusResponseDto= new StatusEvalUnitsResponseDto();
							
							operationDtoApp.setId((int) fila[0]);
							operationDtoApp.setName((String) fila[1]);
							
							operationDtoStr2.setId((int) fila[2]);
							operationDtoStr2.setName((String) fila[3]);
							operationDtoStr2.setStatus((int) fila[13]);
							
							
							
							coverageRecordAppDto = new CoverageRecordAppDto();
							//coverageProcessUnitResponseDto = new CoverageProcessUnitResponseDto();
							coverageEvaluationDto = new CoverageEvaluationDto();
							
							operationDtoStatus = new OperationlineDto();
							operationDtoCov = new OperationlineDto();
							operationDtoState = new OperationlineDto();
							// operationDtoPro = new OperationlineDto();
							 
							 
								
						}
															
						
						coverageAppsListResponseDto.setNumofrecords(cuantosregistro);
						coverageAppsListResponseDto.setRecords(listRecord);
						coverageAppsListResponseDto.setSessionvalidthru(fechaComoCadena);
						coverageAppsListResponseDto.setApplication(operationDtoApp);
						coverageAppsListResponseDto.setStrategydet(operationDtoStr2);
						
						return new ResponseEntity(coverageAppsListResponseDto, HttpStatus.OK);
						
						
					} 
						
						else {

							for (Object[] fila : resultados) {
								operationDtoApp = new OperationlineDto();
								operationDtoStr = new OperationlineDto();
								operationDtoStr2 = new OperationlineDtoStatus2();
								
								//coverageRecordAppDto.setDate((Date) fila[4]);
								//seteando el state
								
								//int IdState = (String) fila[6].
								//operationDtoState.setId((int) fila[6]);
								//coverageRecordAppDto.setId((int) fila[12]);
								//operationDtoState.setId((int) fila[6]);
								//operationDtoState.setName((String) fila[5]);
								
								
								
								operationDtoApp.setId((int) fila[0]);
								operationDtoApp.setName((String) fila[1]);
								
								
								operationDtoStr2.setId((int) fila[2]);
								operationDtoStr2.setName((String) fila[3]);
								operationDtoStr2.setStatus((int) fila[13]);
								
								
								
								coverageRecordAppDto = new CoverageRecordAppDto();
								//coverageProcessUnitResponseDto = new CoverageProcessUnitResponseDto();
								coverageEvaluationDto = new CoverageEvaluationDto();
								
								operationDtoStatus = new OperationlineDto();
								operationDtoCov = new OperationlineDto();
								operationDtoState = new OperationlineDto();
								// operationDtoPro = new OperationlineDto();
							}	 
							
								
							coverageAppsListResponseDto.setNumofrecords(cuantosregistro);
							coverageAppsListResponseDto.setRecords(listRecord);
							coverageAppsListResponseDto.setSessionvalidthru(fechaComoCadena);
							coverageAppsListResponseDto.setApplication(operationDtoApp);
							coverageAppsListResponseDto.setStrategydet(operationDtoStr2);
							
							return new ResponseEntity(coverageAppsListResponseDto, HttpStatus.OK);
							
						}		
						
				}catch(Exception e) {
					respuesta.setMsg("Error interno del servidor " + e.getMessage());
					estatus = HttpStatus.INTERNAL_SERVER_ERROR;
				}
				finally {
			        if (entityManager != null && entityManager.isOpen()) {
			            entityManager.close();
			        }
			    }
			} else { // Si la sesión que viene es inválida
				respuesta.setMsg("Sesión expirada o inválida");
				estatus = HttpStatus.BAD_REQUEST;
				return new ResponseEntity(respuesta, estatus);
			}
			return new ResponseEntity(respuesta, estatus);
		}
	}
	
	//coverageapps/coverageappid/history/coverageappshistoryid
	 @PostMapping("/coverageapps/{coverageappid}/history/{coverageappshistoryid}")
	 	public ResponseEntity<ParamsResponseDto> UpsertEvalProcessesInputs(HttpServletRequest request,@RequestBody CoverageAppRequestDto datosEvalProcesses,@PathVariable("coverageappid") final Integer coverageappid,@PathVariable("coverageappshistoryid") final Integer coverageappshistoryid) 
	 			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 = coverageappid;
	 		 int idparametroEvalRecord = coverageappshistoryid;
	 		 
	 		 Optional<Users> encontreSessionUsuario;
	 		 Optional<Evalprocapps> encontreEvalProcessesApp;
	 		 Applications encontreApp;
	 		 
	 		 Coverageapps 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(coverageappid);
	 			/*	int statusCampaigns = 3;
					 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.getCoveragelevelpar()=="") {
	 					  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.getCoveragestatepar()=="") {
	 					  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);
	 					  
	 				  }
	 				  
	 				 String validaestatus;
	 				 switch (datosEvalProcesses.getStatus()) {
	 				    case 0:
	 					  validaestatus = "Ok";
	 					break;
	 				 case 1:
	 					  validaestatus = "Ok";
	 					break;
	 			
	 				  default:
	 					 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 =  coverageappsRepository.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);
				    	  
				       } else {
				    	       // Verifico si existe el id de la Evaluación de Cobertura de App
							   Optional<Coverageapps> obtCoverageApp = coverageappsRepository.findById(idparametroEval);
				    	       Optional<Strategiesdet> estrategia=strategiesdetRepository.findById(obtCoverageApp.get().getStrategiesdetid().getId());
							if (estrategia.isPresent()){
								if (estrategia.get().getStatus()==0) {
									respuesta.setMsg("Estrategia Inactiva");
									estatus = HttpStatus.CONFLICT;
									return new ResponseEntity(respuesta, estatus);
								}
								
								//int existehistoria = coverageappshistoryRepository.countByCoverageappid(coverageappid);
								int estatusevalposition = 0;
			   					String SentenciaBaseFecha = " select count(1) from main.coverageappshistory where coverageappid = " + coverageappid ;
			   				 Query query2 = entityManager.createNativeQuery(SentenciaBaseFecha);
	   					       //	List<Object[]> listacompletastatus = query2.getResultList();
	   					        //  for (Object[] regsta : listacompletastatus) {
	   					        	           //  estatusevalposition = (int) regsta[0];
	   					        	          Number result = (Number) query2.getSingleResult();

	   					        	       // 3. Convertir el Number a int.
	   					        	       estatusevalposition = result.intValue();

	   					    	 
	   					        //  }


							  if (estatusevalposition>0)	{
								  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
								  String fechaFormateada = sdf.format(datosEvalProcesses.getDate());
								  
								  
									String SentenciaBaseFecha2 = " select count(1) from main.coverageappshistory where coverageappid = " + coverageappid + " and date > " + "'"+ fechaFormateada + "'"   ;
					   				 Query query3 = entityManager.createNativeQuery(SentenciaBaseFecha2);
			   					    
			   					        	          Number result1 = (Number) query3.getSingleResult();
			   					        	          int estatusevalpositionfecha = 0;
			   					        	          estatusevalpositionfecha = result1.intValue();
			   					        	          
			   					        	       //@Query("SELECT count(e) FROM Coverageappshistory e WHERE e.coverageappid =?1 and date > ?2")   
								  if ( estatusevalpositionfecha > 0) {
									 respuesta.setMsg("Llamada al servicio malformado - Fecha de Historia menor que la existente");
									 estatus = HttpStatus.BAD_REQUEST;
									 return new ResponseEntity(respuesta, estatus);
								}
							  }	
							}
				       }
	 				
	 				 
	 				   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,352);
	 						//   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 =  coverageappshistoryRepository.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,351);
	 					  // 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 {
	 			String valorParamsStraDepe = "";				
	 			

	  					
	 			if (idparametroEvalRecord==0) {
	 							
	 				//Coverageapps evalprocInput = new Coverageapps();
	 				Coverageappshistory coverageappsInsert = new Coverageappshistory();
	 				
	 				try {
	 					
	 					 // encontreEvalProcessesApp;
	 					  encontreEvalProcesses = coverageappsRepository.getById(idparametroEval);
	 					//  boolean existeuniproce = unitprocessesRepository.existsByUnitidAndProcessid(datosEvalProcesses.getUnitid(),datosEvalProcesses.getProcessid());
	 					  
	 					
	 					
	 					coverageappsInsert.setCoverageappid(encontreEvalProcesses);
	 					//coverageappsInsert.setCoveragelevelpar(datosEvalProcesses.getCoveragelevelpar());
	 					//coverageappsInsert.setCoveragestatepar(datosEvalProcesses.getCoveragestatepar());
	 					coverageappsInsert.setCoveragelevelpar(Integer.parseInt(datosEvalProcesses.getCoveragelevelpar()));
	 					coverageappsInsert.setCoveragestatepar(Integer.parseInt(datosEvalProcesses.getCoveragestatepar()));
	 					coverageappsInsert.setDsc(datosEvalProcesses.getDsc());
	 					coverageappsInsert.setDate(datosEvalProcesses.getDate());
	 					coverageappsInsert.setModifiedat(fechaDate);
	 					coverageappsInsert.setCreatedat(fechaDate);
	 					coverageappsInsert.setStatus(datosEvalProcesses.getStatus());
	 			
	 					
	 					coverageappshistoryRepository.save(coverageappsInsert);
	 					
	 					int maxiInsertado = coverageappshistoryRepository.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 = "Cobertura de Aplicaciones";
	 				     String Descmodule = "Se agregó la Evaluación de Coberturas de Aplicaciones Historica con id: " + idmensaje;
	 				   // Descmodule = "Se agregó la Evaluación de Coberturas de Procesos de Historia: "
	 				    
	 			         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;
	 				Coverageappshistory coverageappsUpdate;
	 				
	 		
	 				try {
	 					
	 					
	 					coverageappsUpdate = coverageappshistoryRepository.getById(valor2);
	 				
	 				    int maxiInsertado = coverageappsUpdate.getId();
	 					
	 				   //encontreEvalProcesses = evalprocessesRepository.getById(idparametroEval);
	 				    encontreEvalProcesses = coverageappsRepository.getById(idparametroEval);
	 					 	 					
	 					
	 				    coverageappsUpdate.setCoverageappid(encontreEvalProcesses);
	 				    coverageappsUpdate.setCoveragelevelpar(Integer.parseInt(datosEvalProcesses.getCoveragelevelpar()));
	 				    coverageappsUpdate.setCoveragestatepar(Integer.parseInt(datosEvalProcesses.getCoveragestatepar()));
	 				   // coverageappsUpdate.setCreatedat(datosEvalProcesses.ge);
	 				    //coverageappsUpdate.setModifiedat(fecha2);
	 				    coverageappsUpdate.setDate(datosEvalProcesses.getDate());
	 				    coverageappsUpdate.setDsc(datosEvalProcesses.getDsc());
	 				    coverageappsUpdate.setStatus(datosEvalProcesses.getStatus());
	 				    
	 				    
	 	
	 				   coverageappshistoryRepository.save(coverageappsUpdate);
	 					//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 = "Cobertura de Aplicaciones";
	 			     //String Descmodule = "Actualización de parametro del Sistema con id: " + parmid  ;
	 			     String Descmodule = "Se actualizó la Evaluación de Coberturas de Aplicaciones Historica con id: " + idmensaje;
	 			    //Se agregó la Cobertura de Aplicaciones Historica con id
	 		         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("/coverageapps/{coverageappid}/history/{coverageappshistoryid}")
     public ResponseEntity<?> deleteCoverageAppHistory(HttpServletRequest request, @PathVariable("coverageappid") final Integer coverageappid,@PathVariable("coverageappshistoryid") final Integer coverageappshistoryid) throws ParseException {
 		
 		RespuestaValueDto respuestaValueDto;
 		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
 		HttpStatus estatus = HttpStatus.FORBIDDEN;
 		
 	         
 		 int idparametroEval = coverageappid;
 		 int idparametroEvalRec = coverageappshistoryid;
 		 
 		 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(coverageappid);
				/* int statusCampaigns=1;
				 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 =  coverageappsRepository.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);
 				    	  
 				       } else {
			    	       // Verifico si existe el id de la Evaluación de Cobertura de App
						   Optional<Coverageapps> obtCoverageApp = coverageappsRepository.findById(idparametroEval);
			    	       Optional<Strategiesdet> estrategia=strategiesdetRepository.findById(obtCoverageApp.get().getStrategiesdetid().getId());
						if (estrategia.isPresent()){
							if (estrategia.get().getStatus()==0) {
								//respuesta.setMsg("Estrategia Inactiva");
								//estatus = HttpStatus.CONFLICT;
							///	return new ResponseEntity(respuesta, estatus);
							}
						}
			       }
 					   
 				   
 					   
 						  // boolean existeEvalidApp =  evalprocinputsRepository.existsById(idparametroEvalRec);
 					  boolean existeEvalidApp =  coverageappshistoryRepository.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,353);
 					   // 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 {
 			

 			           Coverageappshistory evalprocRec;	
 			           
 			         // coverageappshistoryRepository
 			        
 			   
						  
 			          coverageappshistoryRepository.deleteCoverageHistorybyid(idparametroEvalRec);
						  
					
 			        //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
 				     String module = "Cobertura de Aplicaciones";
 				     String Descmodule = "Se Eliminó la Evaluación de Cobertura de Aplicaciones Historica con Id: " + idparametroEvalRec;
 				    
 			         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(idparametroEvalRec);
 					
 						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);
 	
 	}



}
