package com.dacrt.SBIABackend.controler;

//import java.io.PrintWriter;
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.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.Transactional;

import org.slf4j.Logger;

import java.io.IOException;
import java.io.PrintWriter;
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.HttpHeaders;
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.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.StatusDto2;
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.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.EvalProcessesAppEntryRespondeDto;
import com.dacrt.SBIABackend.dto.responseDto.EvalProcessesSupplierResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.EvalprocessesResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.RespuestaEstatusUpdateDto;
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.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.EvalprosuppliersRepository;
import com.dacrt.SBIABackend.repository.SuppliersRepository;
import com.dacrt.SBIABackend.security.dto.AuditRequestDto;
import com.dacrt.SBIABackend.security.dto.ParamsDto;
import com.dacrt.SBIABackend.security.dto.ParamsResponseDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesAllDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesDto;
import com.dacrt.SBIABackend.security.dto.RespuestaDto;
import com.dacrt.SBIABackend.security.dto.RespuestaMsgDto;
import com.dacrt.SBIABackend.security.dto.RespuestaValueDto;
import com.dacrt.SBIABackend.security.dto.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 EvalprocessesController {
	@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
	EvalprocappsRepository evalprocappsRepository;
	
	@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("/evalprocesses")
	public ResponseEntity<String> applications(HttpServletRequest request,HttpServletResponse response,@RequestBody EvalProcessRequestDto evalProcessRequestDto) throws ParseException, IOException {
	//public ResponseEntity<EvalProcessResponseDto> applications(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;

		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 impact = 0L;
		Long app = 0L;
		Long supplier = 0L;
		Long record = 0L;
		Long periods = 0L;
		Long inputs = 0L;
		Long report = 0L;
		//CSVPrinter csvPrinter = new CSVPrinter(out, format);
		
		// Verifico la session
		if (sessionid == null) {
			respuesta.setMsg("Llamada al servicio malformado");
			estatus = HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		} else {
			sessionid = sessionid.substring(7);
			// verifico si la sesión del usuario existe.
			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
			if (encontreSessionUsuario.isPresent()) { // si la sesión del usuario existe
				Date FechaReg = encontreSessionUsuario.get().getValidthru();
				// Llamada a la funcion que validad el tiempo de Session, retorna la fecha
				// sumandole el tiempo de session activa, y vacio si no esta activa
				fechaComoCadena = securityService.consultarSessionActiva(FechaReg, fecha2,
						encontreSessionUsuario.get().getId());
				
				if (fechaComoCadena == "") {
					RespuestaMsgDto respuestaDto2;
					String var2 = "";
					boolean bloked2 = false;
					respuestaDto2 = new RespuestaMsgDto(var2);
					respuestaDto2.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto2, HttpStatus.UNAUTHORIZED);
				}
				
				// Obtengo el rol de usuario y verifico si corresponde al privilegio del usuario
				rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 200);
				if (rolisvalid == 0) {
					respuesta.setMsg("No tiene los Privilegios");
					estatus = HttpStatus.FORBIDDEN;
					return new ResponseEntity(respuesta, estatus);
				}
				
				// Obtengo los datos del Body
				//searchIn = evalProcessRequestDto.getFilters().getSearch();// dato de busqueda por nombre
				searchIn = evalProcessRequestDto.getFilters().getSearch();

				
			    String Salida = usersService.verificarCaracteresValidosConRegex(searchIn);
				  
				  if (Salida=="NOOK") {
					  String var = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						//respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Caracteres no permitidos en la busqueda"); 
						return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
				  }
				   
				  
				searchIn = usersService.eliminarAcentosService(evalProcessRequestDto.getFilters().getSearch()); 
				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
				
				int formatIn = 0;
				
				try {
					formatIn = evalProcessRequestDto.getFormat();

				} catch (Exception e) {
					formatIn = 0;

				}
				
				
				
				
				
				if (contentIn != null && contentIn != "") {
					menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());
				}
				
				
				
	      if (1==1) {
				try {
					Query query;
					Integer idUsuario2=encontreSessionUsuario.get().getId();
					//Cantidad de procesos a evaluar
					String sentenciaCantidadProcesos="SELECT count(eval.id) "
							+ " FROM  main.campaigns c "
							+ " INNER JOIN main.campaignunits cu "
							+ " ON c.id= :campanaid AND cu.campaingid=c.id "
							///+ " INNER JOIN main.unitprocesses up AND UP.deleted IS NULL "   esto estaba comentado originalmente comentario puesto el 07/08/2025
							+ " INNER JOIN main.evalprocesses eval ON eval.campaignunitid=cu.id "  // esta linea estaba originalmente abajo de la linea + "  INNER JOIN main.unitprocesses up on eval.unitprocessid = up.id  AND up.deleted IS NULL "
							//+ " INNER JOIN main.unitprocesses up on eval.unitprocessid = up.id  AND up.deleted IS NULL "
							+ " INNER JOIN main.userunits US ON US.unitid=cu.unitid and US.userid = :idUsuario";
					query = entityManager.createNativeQuery(sentenciaCantidadProcesos);
					query.setParameter("campanaid", campaingIn);
					query.setParameter("idUsuario", idUsuario2);
					Object resultadoCantidadProcesos = query.getSingleResult();
					Integer cantidadProcesos = ((Number) resultadoCantidadProcesos).intValue();
					
					
					String sentenciaCantidadCerrados=" SELECT SUM(CASE WHEN ep.impactst = 1 THEN 1 ELSE 0 END) AS impact, "
													+ "       SUM(CASE WHEN ep.appst = 1 THEN 1 ELSE 0 END) AS app, "
													+ "	      SUM(CASE WHEN ep.suplierst = 1 THEN 1 ELSE 0 END) AS suplier, "
													+ "	      SUM(CASE WHEN ep.recordst = 1 THEN 1 ELSE 0 END) AS record, "
													+ "	      SUM(CASE WHEN ep.periodst = 1 THEN 1 ELSE 0 END) AS periods, "
													+ "	      SUM(CASE WHEN ep.inputst = 1 THEN 1 ELSE 0 END) AS inputs, "
													+ "	      SUM(CASE WHEN ep.reportst = 1 THEN 1 ELSE 0 END) AS report "
													+ " FROM main.campaigns c "
													+ " INNER JOIN main.campaignunits cu ON c.id = :campanaid AND cu.campaingid = c.id "
													+ " INNER JOIN main.unitprocesses up ON up.unitid = cu.unitid "
													+ " INNER JOIN main.userunits US ON US.unitid = UP.unitid AND US.userid = :idUsuario "
													+ " INNER JOIN main.evalprocesses ep ON cu.id = ep.campaignunitid AND up.id = ep.unitprocessid";
					query = entityManager.createNativeQuery(sentenciaCantidadCerrados);
					query.setParameter("campanaid", campaingIn);
					query.setParameter("idUsuario", idUsuario2);
					List<Object[]> resultadoCantidadCerrados = query.getResultList();
					cuantosregistro = (long) query.getResultList().size();
					
					
					if (cuantosregistro > 0) {
						for (Object[] fila : resultadoCantidadCerrados) {
							impact = (fila[0] != null) ? ((Number) fila[0]).longValue() : 0L;
							app = (fila[1] != null) ? ((Number) fila[1]).longValue() : 0L;
							supplier = (fila[2] != null) ? ((Number) fila[2]).longValue() : 0L;
							record = (fila[3] != null) ? ((Number) fila[3]).longValue() : 0L;
							periods = (fila[4] != null) ? ((Number) fila[4]).longValue() : 0L;
							inputs = (fila[5] != null) ? ((Number) fila[5]).longValue() : 0L;
							report = (fila[6] != null) ? ((Number) fila[6]).longValue() : 0L;
						}
					}
					cuantosregistro=0;
					String filtro="";
					switch (campaingIn) {
						case 0:
							filtro = filtro + " AND 1=1 ";
							break;
						default:
							filtro = filtro + " AND CU.campaingid =" + campaingIn;
					}
					
					//Primero verifico e inserto en la la tabla EvalProcess
					String SentenciaInsert = " INSERT INTO main.evalprocesses (campaignunitid, unitprocessid) "
							+ " SELECT ORI.campaingunitid, ORI.unitprocessid "
							+ " FROM "
							+ " ( SELECT  CU.id campaingunitid, UP.id unitprocessid  "
							+ " FROM  main.campaignunits CU "
							+ " INNER JOIN main.campaigns c "
							+ "  ON CU.campaingid=c.id AND c.status=1 " +filtro //Campaña abierta
							+ " INNER JOIN main.unitprocesses UP "
							+ "  ON CU.unitid=UP.unitid AND UP.deleted IS NULL "
							+ "  INNER JOIN main.units U  "
							+ "  ON CU.unitid=u.id and U.status=1 "
							+ "  INNER JOIN main.processes p  "
							+ "  ON UP.processid=p.id and p.status=1 "
							+ "  INNER JOIN main.userunits US "
							+ " ON US.unitid=UP.unitid and US.userid = :idUsuario ) ORI "
							+ " LEFT JOIN "
							+ " ( SELECT campaignunitid, unitprocessid "
							+ "   FROM main.evalprocesses "
							+ " ) DES "
							+ " ON ORI.campaingunitid=DES.campaignunitid "
							+ " AND ORI.unitprocessid=DES.unitprocessid "
							+ " WHERE DES.unitprocessid IS NULL ";
					
					System.out.println(SentenciaInsert);
					query = entityManager.createNativeQuery(SentenciaInsert);
					query.setParameter("idUsuario", idUsuario2);
					int cuantosregistro2 = query.executeUpdate();
					
					//Busco en el evalprocessen el evalprocess las unidades procesos del usuario 
					//en la campaña tiene un deleted y ninguno de los estatus esta marcado, 
					//lo elimino del evalprocess
					String SentenciaDeleted = "DELETE FROM main.evalprocesses "
						    + "WHERE id IN ( "
						    + "    SELECT ep.id "
						    + "    FROM main.evalprocesses ep "
						    + "    INNER JOIN main.campaignunits CU ON ep.campaignunitid = CU.id "
						    + "    INNER JOIN main.campaigns c ON CU.campaingid = c.id AND c.status = 1 " + filtro
						    + "    INNER JOIN main.unitprocesses UP ON ep.unitprocessid = UP.id AND CU.unitid = UP.unitid AND UP.deleted IS NOT NULL "
						    + "    INNER JOIN main.units U ON CU.unitid = u.id "
						    + "    INNER JOIN main.processes p ON UP.processid = p.id "
						    + "    INNER JOIN main.userunits US ON US.unitid = UP.unitid AND US.userid = :idUsuario "
						    + "    WHERE ep.appst=0 AND ep.impactst=0 AND ep.suplierst=0 AND ep.recordst=0 AND ep.periodst=0 AND ep.inputst=0 AND ep.reportst=0 "
						    + ")";
					
					query = entityManager.createNativeQuery(SentenciaDeleted);
					query.setParameter("idUsuario", idUsuario2);
					int filasEliminadas = query.executeUpdate();
					
					String QueryTotal="";
					String LowerSearch = searchIn.toLowerCase(); // se convierte en minúscula
					//Luego consulto la tabla EvalProcess
					String SentenciaBase = "SELECT e.id, u.id AS idUnidad ,u.name AS nombre_unidad, p.id AS idProceso, "
							+ "                    p.name AS nombre_proceso, "
							+ "	                   CASE WHEN e.impactst = 1 THEN true ELSE false END AS impact, "
							+ "	                   CASE WHEN e.appst = 1 THEN true ELSE false END AS app, "
							+ "	                   CASE WHEN e.suplierst = 1 THEN true ELSE false END AS supplier, "
							+ "	                   CASE WHEN e.recordst = 1 THEN true ELSE false END AS record, "
							+ "	                   CASE WHEN e.periodst = 1 THEN true ELSE false END AS period, "
							+ "	                   CASE WHEN e.inputst = 1 THEN true ELSE false END AS input, "
							+ "	                   CASE WHEN e.reportst = 1 THEN true ELSE false END AS report, "
							+ "                    p.operationlineid, "
							+ "                    l.name AS nombre_lineaoperacion,"
							+ "                    CASE "
							+ "                         WHEN up.deleted is not null THEN 0 "
							+ "                         WHEN u.status = 1 THEN 1 "
							+ "                         WHEN u.status = 0 THEN 0 "
							+ "                    END AS st_unidad, "
							+ "                    CASE "
							+ "                         WHEN up.deleted is not null THEN 'Inactivo' "
							+ "                         WHEN u.status = 1 THEN 'Activo' "
							+ "                         WHEN u.status = 0 THEN 'Inactivo' "
							+ "                    END AS destatus_unidad,"
							+ "                    CASE "
							+ "                         WHEN up.deleted is not null THEN 0 "
							+ "                         WHEN p.status = 1 THEN 1 "
							+ "                         WHEN p.status = 0 THEN 0 "
							+ "                    END AS st_proceso, "
							+ "                    CASE "
							+ "                         WHEN up.deleted is not null THEN 'Inactivo' "
							+ "							WHEN p.status = 1 THEN 'Activo' "
							+ "							WHEN p.status = 0 THEN 'Inactivo' "
							+ "					   END AS destatus_proceso "
							+ "	            FROM main.evalprocesses e, "
							+ "	                 main.campaignunits cu, "
							+ "	                 main.unitprocesses up, "
							+ "	                 main.units u, "
							+ "	                 main.processes p, "
							+ "	                 main.operationlines l, "
							+ "                  main.userunits us "
							+ "             where e.campaignunitid = cu.id "
							+ "               AND e.unitprocessid = up.id "
							+ "               AND cu.unitid=up.unitid "
							+ "               AND cu.unitid=u.id "
							+ "               AND up.processid=p.id "
							+ "               AND p.operationlineid=l.id "
							+ "               AND us.unitid=up.unitid and us.userid = :idUsuario ";
					
					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 ( main.sinacentos(LOWER(u.name)) LIKE  " + "'%" + LowerSearch + "%'" + "  OR"
										+ " main.sinacentos(LOWER(p.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 ( e.impactst <> 0 AND e.appst <> 0 AND e.suplierst <> 0 AND e.recordst <> 0 "
										+ "	AND e.periodst <> 0  AND e.inputst <> 0 AND e.reportst <> 0 )";
								break;
							case 2:
								QueryTotal = QueryTotal + " AND ( e.impactst  = 0 OR e.appst = 0 OR e.suplierst = 0 OR e.recordst = 0 "
										+ " OR e.periodst = 0  OR e.inputst = 0 OR e.reportst = 0 ) ";
								break;
							default:
								respuesta.setMsg("Llamada al servicio malformado");
								estatus = HttpStatus.BAD_REQUEST;
								return new ResponseEntity(respuesta, estatus);
						 }
					
					
					switch (campaingIn) {
						case 0:
							QueryTotal = QueryTotal + " AND 1=1 ";
							break;
						default:
							QueryTotal = QueryTotal + " AND cu.campaingid =" + campaingIn;
					}
					
					switch (orderIn) {
						case 1: // ordena por nombre de unidad
							QueryTotal = QueryTotal + " ORDER BY u.name ASC,p.name ASC ";
							break;
	
						case 2:// ordena por nombre de proceso
							QueryTotal = QueryTotal + " ORDER BY p.name ASC ";
							break;
	
						case 3: // ordena por estatus impactst
							QueryTotal = QueryTotal + " ORDER BY e.impactst ASC";
							break;
						
						case 4: // ordena por estatus appst
							QueryTotal = QueryTotal + " ORDER BY e.appst ASC";
							break;
						
						case 5: // ordena por estatus suplierst
							QueryTotal = QueryTotal + " ORDER BY e.suplierst ASC";
							break;
						
						case 6: // ordena por estatus recordst
							QueryTotal = QueryTotal + " ORDER BY e.recordst ASC";
							break;
					    
						case 7: // ordena por estatus periodst
							QueryTotal = QueryTotal + " ORDER BY  e.periodst ASC";
							break;
						
						case 8: // ordena por estatus inputst
							QueryTotal = QueryTotal + " ORDER BY  e.inputst ASC";
							break;
						
						case 9: // ordena por estatus reportst
							QueryTotal = QueryTotal + " ORDER BY  e.reportst ASC";
							break;
	
						case -1: // ordena por nombre de unidad
							QueryTotal = QueryTotal + " ORDER BY u.name DESC,p.name DESC ";
							break;
	
						case -2:// ordena por nombre de proceso
							QueryTotal = QueryTotal + " ORDER BY p.name DESC ";
							break;
	
						case -3: // ordena por estatus impactst
							QueryTotal = QueryTotal + " ORDER BY e.impactst DESC ";
							break;
						
						case -4: // ordena por estatus appst
							QueryTotal = QueryTotal + " ORDER BY e.appst DESC ";
							break;
						
						case -5: // ordena por estatus suplierst
							QueryTotal = QueryTotal + " ORDER BY e.suplierst DESC ";
							break;
						
						case -6: // ordena por estatus recordst
							QueryTotal = QueryTotal + " ORDER BY e.recordst DESC ";
							break;
					    
						case -7: // ordena por estatus periodst
							QueryTotal = QueryTotal + " ORDER BY  e.periodst DESC ";
							break;
						
						case -8: // ordena por estatus inputst
							QueryTotal = QueryTotal + " ORDER BY  e.inputst DESC ";
							break;
						
						case -9: // ordena por estatus reportst
							QueryTotal = QueryTotal + " ORDER BY  e.reportst DESC ";
							break;
	
						default:
							respuesta.setMsg("Error el ordenamiento no es el correcto");
							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();
					
					EvalProcessResponseDto evalProcessResponseDto = new EvalProcessResponseDto();
					List<EvalProcessRecordsDto> evalProcessResponseDtoList = new ArrayList();
					EvalProcessRecordsDto evalProcessRecordsDto = new EvalProcessRecordsDto();
					UnitsResponseDto unitsResponseDto = new UnitsResponseDto();
					OperationlineDto operationDto = new OperationlineDto();
					
					ProcessResponDto processResponDto = new ProcessResponDto();
					StatusResponseDto statusResponseDto= new StatusResponseDto();
					StatusDto2 status = new StatusDto2();
					StatusDto2 status2 = new StatusDto2();
					PrivilegesAllDto detallePrivilege = new PrivilegesAllDto();
					TotalsResponseDto totalsResponseDto = new TotalsResponseDto();
					Integer contador=0;
					Integer contadorImpact=0;
					Integer contadorApp=0;
					Integer contadorSupplier=0;
					Integer contadorRecord=0;
					Integer contadorPeriod=0;
					Integer contadorInput=0;
					Integer contadorReport=0;
					
					
					if (formatIn==2) {	
						 
				         String unit ="UNIDADES";
				         response.setContentType("text/csv");
					     response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"Evaluaciones_por_procesos.csv\"");
					 try (PrintWriter writer = response.getWriter();
	                // CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader( "UNIDADES", "PROCESOS" , "IM" , "AT" ,  "PR" , "RV" , "PC" ,  "IN" , "RR" ))) {
							 CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader("UNIDADES", "PROCESOS", "IM", "AT", "PR", "RV", "PC", "IN", "RR"))) {
					     
					        if (cuantosregistro > 0) {
								for (Object[] filaformat2 : resultados) {   
									 String cadenaunidad="";
									 String cadenaproceso="";
									 String cadena1 = "";
									 String cadena2 = "";
									 String cadena3 = "";
									 String cadena4 = "";
									 String cadena5 = "";
									 String cadena6 = "";
									 String cadena7 = "";
				                // for (int i = 1; i < cuantosregistro; i++) {
				                	  cadenaunidad = (String) filaformat2[2];
				                	  cadenaunidad = cadenaunidad.replace(',', ' ');
				                	  //cadenaOriginal.replace(',', ' ');
				                	  cadenaproceso = (String) filaformat2[4];
				                	  cadenaproceso = cadenaproceso.replace(',', ' ');
				                     
				                     
				                     if ((boolean) filaformat2[5]==true) {
				                    	 //csvPrinter.printRecord("SI");
				                    	  cadena1="SI"; 
				                    	
				                     } else {
				                    	 //csvPrinter.printRecord("NO");
				                    	  cadena1="NO"; 
				                     }
				                     if ((boolean) filaformat2[6]==true) {
				                    	 // csvPrinter.printRecord("SI");
				                    	  cadena2="SI";
				                     } else {
				                    	 // csvPrinter.printRecord("NO");
				                    	  cadena2="NO"; 
				                     }
				                     if ((boolean) filaformat2[7]==true) {
				                    	 // csvPrinter.printRecord("SI");
				                    	  cadena3="SI";
				                     } else {
				                    	 // csvPrinter.printRecord("NO");
				                    	  cadena3="NO"; 
				                     }
				                     if ((boolean) filaformat2[8]==true) {
				                    	 // csvPrinter.printRecord("SI");
				                    	  cadena4="SI";
				                     } else {
				                    	 // csvPrinter.printRecord("NO");
				                    	  cadena4="NO"; 
				                     }
				                     if ((boolean) filaformat2[9]==true) {
				                    	 // csvPrinter.printRecord("SI");
				                    	  cadena5="SI";
				                     } else {
				                    	 //csvPrinter.printRecord("NO");
				                    	  cadena5="NO"; 
				                     }
				                     if ((boolean) filaformat2[10]==true) {
				                    	 // csvPrinter.printRecord("SI");
				                    	  cadena6="SI";
				                     } else {
				                    	 // csvPrinter.printRecord("NO");
				                    	  cadena6="NO"; 
				                     }
				                     if ((boolean) filaformat2[11]==true) {
				                    	 //csvPrinter.printRecord("SI");
				                    	  cadena7="SI";
				                     } else {
				                    	 // csvPrinter.printRecord("NO");
				                    	  cadena7="NO"; 
				                     }
				                 // }
	                            String Imprimir = "\"" + cadenaunidad+ "\""  + "," + "\""+ cadenaproceso +"\"" + "," + "\"" + cadena1 + "\"" + "," + "\"" + cadena2 + "\""  + "," + "\""+cadena3+"\"" + "," + "\""+cadena4+"\"" + "," + "\""+cadena5+"\"" + "," + "\""+cadena6+"\"" + "," + "\""+cadena7+"\"" ;
	                          csvPrinter.printRecord(Imprimir);
								}
								csvPrinter.flush();
							}  
					        return new ResponseEntity(HttpStatus.OK);
	                  
	                 }
					} 
			if (formatIn==1 || formatIn==0 ) {		
					if (cuantosregistro > 0) {
						for (Object[] fila : resultados) {
							evalProcessRecordsDto.setId((int) fila[0]);
							unitsResponseDto.setId((int) fila[1]);
							unitsResponseDto.setName((String) fila[2]);
							status.setId((Integer) fila[14]);
							status.setName((String) fila[15]);
							unitsResponseDto.setStatus(status);
							
							processResponDto.setId((int) fila[3]);
							processResponDto.setName((String) fila[4]);
							status2.setId((Integer) fila[16]);
							status2.setName((String) fila[17]);
							processResponDto.setStatus(status2);
							
							statusResponseDto.setImpact((boolean) fila[5]);
							statusResponseDto.setApp((boolean) fila[6]);
							statusResponseDto.setSupplier((boolean) fila[7]);
							statusResponseDto.setRecord((boolean) fila[8]);
							statusResponseDto.setPeriod((boolean) fila[9]);
							statusResponseDto.setInput((boolean) fila[10]);
							statusResponseDto.setReport((boolean) fila[11]);
							
							
							 /*try (PrintWriter writer = response.getWriter();
						                CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader("UNIDADES", "PROCESOS", "IM,", "AT", "PR", "RV", "PC", "IN", "RR"))) {
						               
						               for (int i = 1; i < filteredData.size(); i++) {
						                   csvPrinter.printRecord(filteredData.get(i));
						               }
						               csvPrinter.flush();
						           }*/
							
				
							
							if (statusResponseDto.isImpact())
								contadorImpact++;
							
							if (statusResponseDto.isApp())
								contadorApp++;
							
							if (statusResponseDto.isSupplier())
								contadorSupplier++;
							
							if (statusResponseDto.isRecord())
								contadorRecord++;
							
							if (statusResponseDto.isPeriod())
								contadorPeriod++;
							
							if (statusResponseDto.isInput())
								contadorInput++;
							
							if (statusResponseDto.isReport())
								contadorReport++;
							
							operationDto.setId((Integer) fila[12]);
							operationDto.setName((String) fila[13]);
							evalProcessRecordsDto.setUnit(unitsResponseDto);
							evalProcessRecordsDto.setProcess(processResponDto);
							evalProcessRecordsDto.setStatus(statusResponseDto);
							evalProcessRecordsDto.setOprationline(operationDto);
							evalProcessResponseDtoList.add(evalProcessRecordsDto);
							
							unitsResponseDto = new UnitsResponseDto();
							operationDto = new OperationlineDto();
							processResponDto = new ProcessResponDto();
							statusResponseDto= new StatusResponseDto();
							evalProcessRecordsDto= new EvalProcessRecordsDto();
							status = new StatusDto2();
							status2 = new StatusDto2();
							contador++;
						}
						
						
						totalsResponseDto.setImpact(impact.toString()+"/"+cantidadProcesos);
						totalsResponseDto.setApp(app.toString()+"/"+cantidadProcesos);
						totalsResponseDto.setSupplier(supplier.toString()+"/"+cantidadProcesos);
						totalsResponseDto.setRecord(record.toString()+"/"+cantidadProcesos);
						totalsResponseDto.setPeriod(periods.toString()+"/"+cantidadProcesos);
						totalsResponseDto.setInput(inputs.toString()+"/"+cantidadProcesos);
						totalsResponseDto.setReport(report.toString()+"/"+cantidadProcesos);
						
						rolisvalid=0;
						detallePrivilege = new PrivilegesAllDto();
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 201);
						if (rolisvalid>0)
							detallePrivilege.setUpdate(true);
						else
							detallePrivilege.setUpdate(false);

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

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

						rolisvalid=0;
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 203);
						if (rolisvalid>0)
							detallePrivilege.setDelete(true);
						else
							detallePrivilege.setDelete(false);
						
						evalProcessResponseDto.setNumofrecords(cuantosregistro);
						evalProcessResponseDto.setRecords(evalProcessResponseDtoList);
						evalProcessResponseDto.setSessionvalidthru(fechaComoCadena);
						evalProcessResponseDto.setTotals(totalsResponseDto);
						evalProcessResponseDto.setPrivileges(detallePrivilege);
						
						
					}else {
						rolisvalid=0;
						detallePrivilege = new PrivilegesAllDto();
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 201);
						if (rolisvalid>0)
							detallePrivilege.setUpdate(true);
						else
							detallePrivilege.setUpdate(false);

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

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

						rolisvalid=0;
						rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 203);
						if (rolisvalid>0)
							detallePrivilege.setDelete(true);
						else
							detallePrivilege.setDelete(false);
						
						evalProcessResponseDto.setNumofrecords(cuantosregistro);
						evalProcessResponseDto.setRecords(evalProcessResponseDtoList);
						evalProcessResponseDto.setSessionvalidthru(fechaComoCadena);
						evalProcessResponseDto.setTotals(totalsResponseDto);
						evalProcessResponseDto.setPrivileges(detallePrivilege);
					}
			}		
						
						return new ResponseEntity(evalProcessResponseDto, 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);
		}
		}	
		return new ResponseEntity(respuesta, estatus);
	}
	
	

		

    @PostMapping("/evalprocesses/{evalprocessid}/applications/{evalprocappid}")
	public ResponseEntity<ParamsResponseDto> UpsertEvalProcessesApp(HttpServletRequest request,@RequestBody EvalProcessesAppRequestDto datosEvalProcesses,@PathVariable("evalprocessid") final Integer evalprocessid,@PathVariable("evalprocappid") final Integer evalprocappid) 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 idparametroEvalApp = evalprocappid;
		 
		 Optional<Users> encontreSessionUsuario;
		 Optional<Evalprocapps> encontreEvalProcessesApp;
		 Applications encontreApp;
		 
		 Evalprocesses encontreEvalProcesses;
		 
		 int valor = idparametroEval;
		 int valor2 = idparametroEvalApp;
		 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);
					 
				  } 
				
				  if (datosEvalProcesses.getApplicationid()==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.getEvalprocappperiodpar()=="") {
					  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.getEvalprocapprequiredpar()=="") {
					  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.getEvalprocdependencypar()=="") {
					  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 (idparametroEvalApp==0) {
						   
						   existeApp =  applicationsRepository.existsById(datosEvalProcesses.getApplicationid());
						   if (!existeApp) {
					    	    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 {
					    	  
					    	  int isActivoApp = applicationsRepository.getByIdandStatus(datosEvalProcesses.getApplicationid());
					    	  
					    	  if (isActivoApp==0) {
					    		  String var = "";
									boolean bloked = false;
									RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
									//respuestaDto.setBlocked(bloked);
									respuestaDto.setMsg("Llamada al servicio malformado -App Inactiva");
									//Error 400
									return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
					    		  
					    	  }
					    	  
					      }		
						   //el permiso es el 632
						   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 {
						   
						   existeApp =  applicationsRepository.existsById(datosEvalProcesses.getApplicationid());
						   if (!existeApp) {
					    	    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 =  evalprocappsRepository.existsById(idparametroEvalApp);
						   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,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);
						   
					     }
					   } 					   					 											 
						 	
				   
				 } 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 = "";				
			Units tipoUnits2=null;
			Units tipoUnits=null;
			Units tipoUnitsNew2=null;
			Optional<Units> nuevoinsertado = null;
			Unitprocesses tipoUsersUnits = new Unitprocesses();
			

 					
			if (idparametroEvalApp==0) {
							
				Evalprocapps evalprocapp = new Evalprocapps();
				
				
				try {
					
					  encontreEvalProcesses = evalprocessesRepository.getById(idparametroEval);
					  encontreApp = applicationsRepository.getById(datosEvalProcesses.getApplicationid());
				
					  int quantitytotal = 0;
					
					  quantitytotal=paramsService.converttoMinute(datosEvalProcesses.getEvalprocappperiodpar(),datosEvalProcesses.getQty());
					  /*switch (datosEvalProcesses.getEvalprocappperiodpar()) { 
					    case "1":  //ordena por name ascendente
					    	
					    	quantitytotal = datosEvalProcesses.getQty()*60;
					     break;
					    case "2"://ordena por status ascendente
					    	
					    	quantitytotal = datosEvalProcesses.getQty()*1440;
					     break;		
					     
                         case "3"://ordena por status ascendente
					    	
                        	 quantitytotal = datosEvalProcesses.getQty()*1;
					     break;
					     
     				    default:	// viene con el parametro para buscar por el like		   			    				    	
     				    	String var2 = "";
     						boolean bloked = false;
     						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
     						respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
     						estatus=HttpStatus.BAD_REQUEST;   
     						return new ResponseEntity(respuestaDto, estatus); 
					 
					    
					   }*/
					 
					   
					evalprocapp.setApplicationid(encontreApp);
					evalprocapp.setEvalprocappdependencypar(datosEvalProcesses.getEvalprocdependencypar());
					evalprocapp.setEvalprocappperiodpar(datosEvalProcesses.getEvalprocappperiodpar());
					evalprocapp.setEvalprocapprequiredpar(datosEvalProcesses.getEvalprocapprequiredpar());
					evalprocapp.setEvalprocessid(encontreEvalProcesses);
					evalprocapp.setQty(quantitytotal);
					evalprocapp.setCreatedat(fechaDate);
					evalprocapp.setModifiedat(fechaDate);
					
					evalprocappsRepository.save(evalprocapp);
					
					int maxiInsertado = evalprocappsRepository.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ó Aplicacion 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 (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);
			}finally {
		        if (entityManager != null && entityManager.isOpen()) {
		            entityManager.close();
		        }
			}
				
		        
	         

			} else {
				
				//Strategiesdet strategies = new Strategiesdet();
				//Strategiesdet strategies2 = new Strategiesdet();
				Evalprocapps evalprocapp;
		
				
		
				try {
					
					 // encontreEvalProcessesApp;
					  encontreEvalProcesses = evalprocessesRepository.getById(idparametroEval);
					  encontreApp = applicationsRepository.getById(datosEvalProcesses.getApplicationid());
					  evalprocapp = evalprocappsRepository.getById(valor2);
					  int maxiInsertado = evalprocapp.getId();
			
					  int quantitytotal = 0;
					
					  quantitytotal=paramsService.converttoMinute(datosEvalProcesses.getEvalprocappperiodpar(),datosEvalProcesses.getQty());
					  /*switch (datosEvalProcesses.getEvalprocappperiodpar()) { 
					    case "1":  //ordena por name ascendente
					    	
					    	quantitytotal = datosEvalProcesses.getQty()*60;
					     break;
					    case "2"://ordena por status ascendente
					    	
					    	quantitytotal = datosEvalProcesses.getQty()*1440;
					     break;		
					     
                         case "3"://ordena por status ascendente
					    	
                        	 quantitytotal = datosEvalProcesses.getQty()*1;
					     break;
					     
     				    default:	// viene con el parametro para buscar por el like		   			    				    	
     				    	String var2 = "";
     						boolean bloked = false;
     						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
     						respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
     						estatus=HttpStatus.BAD_REQUEST;   
     						return new ResponseEntity(respuestaDto, estatus); 
					 
					    
					   }*/
					  
					  
					 
					evalprocapp.setApplicationid(encontreApp);
					evalprocapp.setEvalprocappdependencypar(datosEvalProcesses.getEvalprocdependencypar());
					evalprocapp.setEvalprocappperiodpar(datosEvalProcesses.getEvalprocappperiodpar());
					evalprocapp.setEvalprocapprequiredpar(datosEvalProcesses.getEvalprocapprequiredpar());
					evalprocapp.setEvalprocessid(encontreEvalProcesses);
					evalprocapp.setQty(quantitytotal);
					evalprocapp.setCreatedat(fechaDate);
					evalprocapp.setModifiedat(fechaDate);
					
					evalprocappsRepository.save(evalprocapp);
					//int maxiInsertado = evalprocappsRepository.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();
					 					            
			
				//Integer idinsertado = strategiesRepository.consultarmaxid();
				  
			    //////////////////////////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ó Aplicacion 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 (Exception e) {
		    	 
		   		 
		    		respuesta= new RespuestaMsgDto("Registro duplicado");
					estatus=HttpStatus.CONFLICT;
					return new ResponseEntity(respuesta, estatus);
		      
			      }
				finally {
			        if (entityManager != null && entityManager.isOpen()) {
			            entityManager.close();
			        }
			    }
		
	  }				
       
		}catch (Exception e) {
            // Manejo de excepciones
			respuesta= new RespuestaMsgDto("Error interno del servidor");
			estatus=HttpStatus.INTERNAL_SERVER_ERROR;            
        }finally {
	        if (entityManager != null && entityManager.isOpen()) {
	            entityManager.close();
	        }
        }
		
		return new ResponseEntity(respuesta, estatus);
	
	}


    

    @PostMapping("/evalprocesses/{evalprocessid}")
    public ResponseEntity<?> updateStatusEvalProcesse(HttpServletRequest request,@RequestBody StatusEvalProcessRequestDto datosEvalProcesses, @PathVariable("evalprocessid") final Integer evalprocessid) throws ParseException {
		
		RespuestaValueDto respuestaValueDto; 
		RespuestaEstatusUpdateDto respuestaEstatusUpdateDto;
		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;
		
		 Optional<Users> encontreSessionUsuario;
		 Optional<Evalprocapps> encontreEvalProcessesApp;
		 Applications encontreApp;
		 
		 Evalprocesses encontreEvalProcesses;
		 
		 //int valor = idparametroEval;
		 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   {
								 
				   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);
					   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);
				    	  
				       } 		
				   
					   Roles roles = encontreSessionUsuario.get().getRolid();
					   int idrol = roles.getId();
					   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol,200);
					    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 {
			

				Evalprocapps evalprocapp = new Evalprocapps();		
				  Connection conexion2 = DriverManager.getConnection(conexion,userbd, passbd);
	    			//(PreparedStatement sentenciaPreparada = conexion2.prepareStatement(sql))
	    			Statement sentenciaPreparada = null;
	    			sentenciaPreparada = conexion2.createStatement();
	    			
			    //impactst, appst, suplierst, recordst, periodst, inputst, reportst
				 int statusnew;
				 
				 switch (datosEvalProcesses.getStatus()) { 
				 
				 
				    case 1:  //ordena por dsc ascendente
				    	
				    	statusnew = datosEvalProcesses.getStatus();
	    	            
				     break;
				    case 0:   //ordena por status ascendente
				    	statusnew = datosEvalProcesses.getStatus();			     
	    	         break;
				    default:
	                   	String var2 = "";
	                   	boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
							respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
							estatus=HttpStatus.BAD_REQUEST;   
							return new ResponseEntity(respuestaDto, estatus);
					    
					   }
	    	         
				 String sql = "";
				 String valida = "";
				 switch (datosEvalProcesses.getField()) { 
				    case "impactst":
				    	 valida = "SI";
				     break;
				    case "appst":   
				    	 valida = "SI";				    	  		   
	    	         break;
                   case "suplierst":  
                	     valida = "SI";                	  
				     break;
                   case "recordst":  
                	   valida = "SI";                 	
                    break;
                   case "periodst":   
                	   valida = "SI";
                   break;
                   case "inputst":   
                	   valida = "SI";                	
                   case "reportst":  
                	   valida = "SI";                	 
                   break;
                   default:
                   	String var2 = "";
                   	boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
						respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
						estatus=HttpStatus.BAD_REQUEST;   
						return new ResponseEntity(respuestaDto, estatus);
				    
				   }
	
				 String sqlStatus = " SELECT u." +  datosEvalProcesses.getField();
		    	    String FromStatus = " FROM main.evalprocesses u WHERE u.id = " + idparametroEval;
		    	    sqlStatus = sqlStatus + FromStatus;
		    	    PreparedStatement pstmt = conexion2.prepareStatement(sqlStatus);
		    	    ResultSet rs = pstmt.executeQuery();
		    	    int estatusactual = 0;
		    	    
		    	    if (rs.next()) {
		                // Obtener el valor entero de la primera columna
		                 estatusactual = rs.getInt(1);
		                System.out.println("El valor entero obtenido es: " + estatusactual);
		            } else {
		            	
		            	String var2 = "";
	                   	boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
							respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
							estatus=HttpStatus.BAD_REQUEST;   
							return new ResponseEntity(respuestaDto, estatus);
		            }
		    	    
		    	  //  modifiedat = TO_TIMESTAMP('2025-08-06 15:15:33', 'YYYY-MM-DD HH24:MI:SS')
                   // String fecha2format = "TO_TIMESTAMP(REPLACE('" + fecha2 + "', 'VET', ''), 'Dy Mon DD HH24:MI:SS YYYY')";
                    String fecha2format = "NOW()";
		    	    sql = " UPDATE main.evalprocesses SET " + datosEvalProcesses.getField() ;
		    	    String sql2  = " = " +  statusnew + ", modifiedat = "  + fecha2format  +   " WHERE id = " + idparametroEval ;
		    	    String sqlall = sql + sql2;
		    	    System.out.println(sqlall);
	                sentenciaPreparada.execute(sqlall);
	                
		    	  
 			         
			        //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
				     String module = "Evaluación por Procesos";
				     String Descmodule = "Se Actualizo el estatus de la Evaluación de Procesos con Id: " + idparametroEval;
				    
			         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(statusnew);
					    respuestaEstatusUpdateDto = new RespuestaEstatusUpdateDto(statusnew);
						estatus=HttpStatus.OK;
						return new ResponseEntity(respuestaEstatusUpdateDto, estatus);                    					        	         

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

    
    
    @DeleteMapping("/evalprocesses/{evalprocessid}/applications/{evalprocappid}")
    public ResponseEntity<?> deleteEvalProcesseApp(HttpServletRequest request, @PathVariable("evalprocessid") final Integer evalprocessid,@PathVariable("evalprocappid") final Integer evalprocappid) 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 idparametroEvalApp = evalprocappid;
		 
		 Optional<Users> encontreSessionUsuario;
		 Optional<Evalprocapps> encontreEvalProcessesApp;
		 Applications encontreApp;
		 
		 Evalprocesses encontreEvalProcesses;
		 
		 int valor = idparametroEval;
		 int valor2 = idparametroEvalApp;
		 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);
					   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 =  evalprocappsRepository.existsById(idparametroEvalApp);
						   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 {
			

				Evalprocapps evalprocapp = new Evalprocapps();									
				evalprocappsRepository.deleteEvalprocappsbyid(evalprocappid);
			
 			         
			        //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
				     String module = "Evaluación por Procesos";
				     String Descmodule = "Se Elimino la Aplicacion en Evaluación de Procesos con Id: " + evalprocappid;
				    
			         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(evalprocappid);
					
						estatus=HttpStatus.OK;
						return new ResponseEntity(respuestaValueDto, estatus);                    					        	         

		
       
		   } catch (Exception e) {
            // Manejo de excepciones
			respuesta= new RespuestaMsgDto("Error interno del servidor");
			estatus=HttpStatus.INTERNAL_SERVER_ERROR;            
        }
		finally {
	        if (entityManager != null && entityManager.isOpen()) {
	            entityManager.close();
	        }
	    }
		
		return new ResponseEntity(respuesta, estatus);
	
	}
    
    
   	@GetMapping("/evalprocesses/{evalprocessid}/suppliers")
   	public ResponseEntity<?> getListSupplierevalprocesses(HttpServletRequest request, @PathVariable("evalprocessid") final Integer evalprocessid)
   			throws ParseException {
   				RespuestaDto respuesta = new RespuestaDto("", false);
   				HttpStatus estatus = HttpStatus.FORBIDDEN;
   				EvalProcessesSupplierResponseDto evaprocessesSuppliResponseDto = new EvalProcessesSupplierResponseDto();
   			
   				RtoRecordSupplierDto detallerto;
   				RtoRecordSupplierDto detallerpo;
   				
   				EvalProccesSuppliRecordDto detalleEvalProccesSuppliDto;
   				StrategiesRecordDto detalleRecord=null;
   				StrategyDetDto detalleStrategy;
   				OperationlineDto  detalletype,detallePeriodo,detalledependencypar,detallerequired,detalleperiodorpo;
   	    		 
   				TypeStrategiDetDto detalleTypeStrategy;
   			     List<UnitsUsersDto> listasUnits = new ArrayList<>();
   			     List<EvalProccesSuppliRecordDto> ListEvalProccesSuppliRecordDto= 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;
   			        
   			        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 (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 =  evalprosuppliersRepository.existsByEvalprocessid(evalprocessid);
   				
   					String SentenciaBase = " SELECT es.id,su.id idsuppl,su.name AS namesuppl,pr4.descr3,pr4.valor3,pr.descr rtodesc, " 
   							+ " pr.valor rtovalor ,pr.filtro rtofiltro,(es.rtoqty / CAST(pr.filtro AS INTEGER)) AS rtoquantity, "
   							+ " pr2.descr1 rpodesc,pr2.valor1 rpovalo ,pr2.filtro1 rpofiltro,(es.rpoqty / CAST(pr2.filtro1 AS INTEGER)) AS rpoquantity, "
   							+ "  coalesce(pr3.descr2 ,'') destiposup,  coalesce(pr3.valor2,'0')	idtiposul,pr4.descr3 AS desrequired,pr4.valor3 AS valorrequired,su.dsc,ep.suplierst "
   							+ " FROM main.evalprocesses ep "
   							+ " INNER JOIN main.evalprocsupliers es ON ep.id = es.evalprocessid"
   						//	+ " LEFT JOIN main.evalprocsupliers es ON ep.id = es.evalprocessid "
   							+ " LEFT JOIN main.suppliers su  ON es.supplierid = su.id "
   							+ " LEFT JOIN (SELECT elemento ->> 'dsc' AS descr,elemento ->> 'value' AS valor,elemento ->> 'filter' AS filtro "
   							+ " FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
   							+ " WHERE p.paramname = 'EVALPROC_PERIOD') pr ON es.rtoevalprocsupperiodpar = pr.valor "
   							+ " LEFT JOIN (SELECT elemento ->> 'dsc' AS descr1,elemento ->> 'value' AS valor1,elemento ->> 'filter' AS filtro1 "
   							+ "    FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
   							+ "    WHERE p.paramname = 'EVALPROC_PERIOD') pr2 ON es.rpoevalprocsupperiodpar = pr2.valor1 "
   							+ " LEFT JOIN (SELECT elemento ->> 'dsc' AS descr2, elemento ->> 'value' AS valor2 FROM  main.params p, "
   							+ " jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
   							+ " WHERE  p.paramname = 'SUPPLIER_TYPE') pr3 ON su.suppliertypepar = pr3.valor2 "
   							+ " LEFT JOIN (SELECT elemento ->> 'dsc' AS descr3,elemento ->> 'value' AS valor3 "
   							+ " FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
   							+ " WHERE p.paramname = 'EVALPROC_YESNO') pr4 ON es.evalprocsuprequiredpar = pr4.valor3 "
   							+ " WHERE "
   							+ "  ep.id = " + evalprocessid
   							+ " ORDER BY "
   							+ " su.name ASC ";																
   									
   					 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) {
				    		int idestatusevaluacionsuppliers = evalprocessesRepository.getStatusSupplierById(evalprocessid);
				    		 if (idestatusevaluacionsuppliers==0) {
				    			 codigoestatusdefault = 0;
						    		descestatusdefault = "Activa";
						    		detalleStatysApp= new  OperationlineDto();
						    		detalleStatysApp.setId(codigoestatusdefault);
						    		detalleStatysApp.setName(descestatusdefault);
				    		 } 
				    		 if (idestatusevaluacionsuppliers==1) {
				    		     	codigoestatusdefault = 1;
						    		descestatusdefault = "Cerrada";
						    		detalleStatysApp= new  OperationlineDto();
						    		detalleStatysApp.setId(codigoestatusdefault);
						    		detalleStatysApp.setName(descestatusdefault);
				    		 } 
				    		
				    		
				    	}
				    	
   					       
   						   List<Object[]> listacompleta = query.getResultList();
   						   ListEvalProccesSuppliRecordDto= new ArrayList<>();
   						  
   				    		   for (Object[] reg : listacompleta) {
   				    		 
   				    			detalleEvalProccesSuppliDto = new EvalProccesSuppliRecordDto();
   				    		 
   				    		   detalletype = new  OperationlineDto();
   				    		   detallerto = new  RtoRecordSupplierDto();
   				    		   detallerpo = new  RtoRecordSupplierDto();
   				    		   detallePeriodo = new  OperationlineDto();
   				    		   detallerequired= new  OperationlineDto();
   				    		   detalleperiodorpo= new  OperationlineDto();
   				    		   detalleStatysApp= new  OperationlineDto();
   				    		   
   				    		   
   				    		    detalleEvalProccesSuppliDto.setId((int) reg[0]);
   				    		    detalleEvalProccesSuppliDto.setSupplierid((int) reg[1]);
   				    		    detalleEvalProccesSuppliDto.setName((String) reg[2]); 
   				    		    detalleEvalProccesSuppliDto.setDsc((String) reg[17]);
   				    		    
   				    	  	    
   				    		    String idtypeString = (String) reg[14];
 				    		    Integer valorid1 = Integer.parseInt(idtypeString);
 				    		   
   				    		       detalletype.setId(valorid1);
   				    		       detalletype.setName((String) reg[13]);
   				    		    detalleEvalProccesSuppliDto.setType(detalletype);
   				    		  ///////////seteo el objeto dto del rto 
   				    		    String idtyperto = (String) reg[6];
				    		    Integer valoridrto = Integer.parseInt(idtyperto);
				    		  
   				    	      	   detallePeriodo.setId(valoridrto);
   				    	           detallePeriodo.setName((String) reg[5]);
   				    	         
   				    	           detallerto.setPeriod(detallePeriodo);
   				    	           detallerto.setQty((int) reg[8]);
   				    	        detalleEvalProccesSuppliDto.setRto(detallerto);
   				    	        
   				               ////////////fin del set rpo//////// 
   				    	       /////seteo el objeto dto del rpo
   				    	        
   				    	        String idtyperpo = (String) reg[10];
				    		    Integer valoridrpo = Integer.parseInt(idtyperpo);
				    		  
				    		       detalleperiodorpo.setId(valoridrpo);
				    		       detalleperiodorpo.setName((String) reg[9]);
				    	         
				    		       detallerpo.setPeriod(detalleperiodorpo);
				    		       detallerpo.setQty((int) reg[12]);
				    	        detalleEvalProccesSuppliDto.setRpo(detallerpo);
				    	        ////////////fin del set rpo////////
   				    	      
   				    		 
   				    		   //seteo el requiredpar 
   				    		    String idtypeReq = (String) reg[16];
   				    		    Integer valoridRequ = Integer.parseInt(idtypeReq);
   				    		    detallerequired.setId(valoridRequ);
   				    		    detallerequired.setName((String) reg[15]);
   				    		    
   				    		    
   				    		 detalleStatysApp.setId((int) reg[18]);
   				    		   if ((int) reg[18]==1) {
				    			   detalleStatysApp.setName("Cerrada");
				    			   
				    		   } else
				    		   {
				    			   detalleStatysApp.setName("Activa");
				    		   }
				    		   
   				    		   
   				    	 	   detalleEvalProccesSuppliDto.setRequiredpar(detallerequired);    				    		   				    		   				    		   				    								    								    				    	
   					    	  
   				    	 	ListEvalProccesSuppliRecordDto.add(detalleEvalProccesSuppliDto);
   				    	   }
   					
   				    					    					    	
   				    		evaprocessesSuppliResponseDto.setNumofrecords(cuantosregistro);
   				    		evaprocessesSuppliResponseDto.setSessionvalidthru(fechaComoCadena);
   				    		evaprocessesSuppliResponseDto.setRecords(ListEvalProccesSuppliRecordDto);
   				    		evaprocessesSuppliResponseDto.setStatus(detalleStatysApp);
   		                return ResponseEntity.ok(evaprocessesSuppliResponseDto);

   				
   		       
   				} 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}/applications")
	public ResponseEntity<?> getListAppevalprocesses(HttpServletRequest request, @PathVariable("evalprocessid") final Integer evalprocessid)
			throws ParseException {
				RespuestaDto respuesta = new RespuestaDto("", false);
				HttpStatus estatus = HttpStatus.FORBIDDEN;
				//EvalprocessesResponseDto evaprocessesResponseDto = new EvalprocessesResponseDto();
				EvalprocessesResponseDto evaprocessesResponseDto = new EvalprocessesResponseDto();
				//StrategiesRecordDto
			//	ParamsDto detalleParams;
				UnitsUsersDto detalleUnits;
				UnitsUsersDto detalleProce;
				
				EvalProccesAppDto detalleEvalProccesAppDto;
				StrategiesRecordDto detalleRecord=null;
				StrategyDetDto detalleStrategy;
				OperationlineDto detalleStatysApp = null;
				OperationlineDto  detalletype,detalleFacility,detalledependencypar,detallerequired,detalleperiodo;
	    		 
				TypeStrategiDetDto detalleTypeStrategy;
				StrategiesDependencyDetDto detalleTipoDependencia;
			     List<UnitsUsersDto> listasUnits = new ArrayList<>();
			     List<EvalProccesAppDto> ListEvalProccesAppDto= new ArrayList<>();
			     List<UnitsUsersDto> listasProcess = new ArrayList<>();
			  
			     Long cuantosregistro = (long) 0;
			     
			    // List<PrivilegesDto> listasPrivelege = new ArrayList<>();
				 
				 String sessionid = request.getHeader("Authorization");
				  Date fecha = new Date();
				    SimpleDateFormat  formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			        String dataFormattata = formatter.format(fecha);
			        Date fechaDate = formatter.parse(dataFormattata);
			        AuditRequestDto  auditDto=new AuditRequestDto();
			        int idUser;
			        
			        int rolisvalidDRP;			       
			        int idrol,searchIdStrategyGeneral,searchUnitid;
			   	
			       String searchStrategytype,searchstrategydependency;
					  
			     // 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 (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 "
							+ "    ea.id, "
							+ "    ap.id AS idapp, "
							+ "    ap.name AS nameapp, "
							+ "    pr4.descr3, "
							+ "    pr4.valor3, "
							+ "    fa.id AS idinstala, "
							+ "    fa.name AS nameinstala, "
							+ "    pr.descr, "
							+ "    pr.valor, "
							+ "    pr.filtro,"
							+ "    (ea.qty / CAST(pr.filtro AS INTEGER)) AS quantity, "
							+ "    pr2.descr1 AS desdepen, "
							+ "    pr2.valor1 AS valordepen, "
							+ "    pr3.descr2 AS desrequired, "
							+ "    pr3.valor2 AS valorrequired, ep.appst "
							+ " FROM "
							+ "    main.evalprocesses ep "
							+ " JOIN "
							+ "    main.evalprocapps ea ON ep.id = ea.evalprocessid "
							+ " JOIN "
							+ "    main.applications ap ON ea.applicationid = ap.id "
							+ " JOIN "
							+ "    main.facilities fa ON ap.facilityid = fa.id "
							+ " LEFT JOIN ( "
							+ "    SELECT "
							+ "        elemento ->> 'dsc' AS descr3, "
							+ "        elemento ->> 'value' AS valor3 "
							+ "    FROM "
							+ "        main.params p, "
							+ "        jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
							+ "    WHERE "
							+ "        p.paramname = 'APPS_TYPE'"
							+ " ) pr4 ON ap.apptypepar = pr4.valor3 "
							+ " LEFT JOIN ( "
							+ "    SELECT "
							+ "        elemento ->> 'dsc' AS descr, "
							+ "        elemento ->> 'value' AS valor, "
							+ "        elemento ->> 'filter' AS filtro "
							+ "    FROM "
							+ "        main.params p, "
							+ "        jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
							+ "    WHERE "
							+ "        p.paramname = 'EVALPROC_PERIOD' "
							+ ") pr ON ea.evalprocappperiodpar = pr.valor "
							+ " LEFT JOIN ( "
							+ "    SELECT "
							+ "        elemento ->> 'dsc' AS descr1, "
							+ "        elemento ->> 'value' AS valor1 "
							+ "    FROM "
							+ "        main.params p, "
							+ "        jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
							+ "    WHERE "
							+ "        p.paramname = 'EVALPROC_SCALEAPP' "
							+ ") pr2 ON ea.evalprocappdependencypar = pr2.valor1 "
							+ " LEFT JOIN ( "
							+ "    SELECT "
							+ "        elemento ->> 'dsc' AS descr2, "
							+ "        elemento ->> 'value' AS valor2 "
							+ "    FROM "
							+ "        main.params p, "
							+ "        jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
							+ "    WHERE "
							+ "        p.paramname = 'EVALPROC_YESNO' "
							+ ") pr3 ON ea.evalprocapprequiredpar = pr3.valor2 "
							+ " WHERE "
							+ "    ep.id = " + evalprocessid
							+ " ORDER BY"
							+ " ap.name ASC";																
									
					 String QueryTotal = "";
					 QueryTotal = SentenciaBase;
 					
					 	 
					 Query query = entityManager.createNativeQuery(QueryTotal);
					  cuantosregistro = (long) jdbcTemplate.queryForList(QueryTotal).size();
					  
					  int codigoestatusdefault;
					    	String descestatusdefault;
					    	
					    	if (cuantosregistro==0) {
					    		/*codigoestatusdefault = 0;
					    		descestatusdefault = "Activa";
					    		detalleStatysApp= new  OperationlineDto();
					    		detalleStatysApp.setId(codigoestatusdefault);
					    		detalleStatysApp.setName(descestatusdefault);*/
					    		
					    		int idestatusevaluacionApp = evalprocessesRepository.getStatusApprById(evalprocessid);
					    		 if (idestatusevaluacionApp==0) {
					    			 codigoestatusdefault = 0;
							    		descestatusdefault = "Activa";
							    		detalleStatysApp= new  OperationlineDto();
							    		detalleStatysApp.setId(codigoestatusdefault);
							    		detalleStatysApp.setName(descestatusdefault);
					    		 } 
					    		 if (idestatusevaluacionApp==1) {
					    		     	codigoestatusdefault = 1;
							    		descestatusdefault = "Cerrada";
							    		detalleStatysApp= new  OperationlineDto();
							    		detalleStatysApp.setId(codigoestatusdefault);
							    		detalleStatysApp.setName(descestatusdefault);
					    		 } 
					    		
					    	}
					    	
					       
					       query = entityManager.createNativeQuery(QueryTotal);
					       //query.setFirstResult(offsetIn);
						   //query.setMaxResults(numofrecordsIn);
						   List<Object[]> listacompleta = query.getResultList();
						  ListEvalProccesAppDto= new ArrayList<>();
						  
				    		   for (Object[] reg : listacompleta) {
				    		 
				    		   detalleEvalProccesAppDto = new EvalProccesAppDto();
				    		   detalleRecord = new StrategiesRecordDto();
				    		   detalletype = new  OperationlineDto();
				    		   detalleFacility= new  OperationlineDto();
				    		   detalledependencypar= new  OperationlineDto();
				    		   detallerequired= new  OperationlineDto();
				    		   detalleperiodo= new  OperationlineDto();
				    		   detalleStatysApp = new  OperationlineDto();
				    		   
				    		   
				    		   detalleEvalProccesAppDto.setId((int) reg[0]);
				    		   detalleEvalProccesAppDto.setApplicationid((int) reg[1]);
				    		   detalleEvalProccesAppDto.setName((String) reg[2]);
				    		   ///seteo los valores del type de app
				    		   String idtypeString = (String) reg[4];
				    		   Integer valorid = Integer.parseInt(idtypeString);
				    		   detalletype.setId(valorid);
				    		   detalletype.setName((String) reg[3]);
				    		   //seteo el facility
				    		   detalleFacility.setId((int) reg[5]);
				    		   detalleFacility.setName((String) reg[6]);
				    		  //seteo el dependency 
				    		   String idtypeString2 = (String) reg[12];
				    		   Integer valorid2 = Integer.parseInt(idtypeString2);
				    		   detalledependencypar.setId(valorid2);
				    		   detalledependencypar.setName((String) reg[11]);
				    		   //seteo el requiredpar 
				    		   String idtypeString3 = (String) reg[14];
				    		   Integer valorid3 = Integer.parseInt(idtypeString3);
				    		   detallerequired.setId(valorid3);
				    		   detallerequired.setName((String) reg[13]);
				    		   Integer cantidadint = (int) reg[10];
				    		   String cantidadCadena = cantidadint.toString();
				    		   detalleEvalProccesAppDto.setQty(cantidadCadena);
				    		   //seteo el periodo
				    		   String idtypeString4 = (String) reg[8];
				    		   Integer valorid4 = Integer.parseInt(idtypeString4);
				    		   detalleperiodo.setId(valorid4);
				    		   detalleperiodo.setName((String) reg[7]);
				    		
				    		   detalleEvalProccesAppDto.setFacility(detalleFacility);
				    		   detalleEvalProccesAppDto.setDependencypar(detalledependencypar);
				    		   detalleEvalProccesAppDto.setPeriodpar(detalleperiodo);
				    		   detalleEvalProccesAppDto.setRequiredpar(detallerequired);
				    		   detalleEvalProccesAppDto.setType(detalletype);
				    		   				    		   				    								    								    				    	
					    	  
				    		   ListEvalProccesAppDto.add(detalleEvalProccesAppDto);
				    		   
				    		   //String idtypeStringStatus = (String) reg[15];
				    		   //Integer valorstatus = Integer.parseInt(valorstatus);
				    		   detalleStatysApp.setId((int) reg[15]);
				    		   
				    		   if ((int) reg[15]==1) {
				    			   detalleStatysApp.setName("Cerrada");
				    			   
				    		   } else
				    		   {
				    			   detalleStatysApp.setName("Activa");
				    		   }
				    		   
				    		  
				    		   
				    		   
				    	   }
				    					    					    	
				    		   evaprocessesResponseDto.setNumofrecords(cuantosregistro);
					           evaprocessesResponseDto.setSessionvalidthru(fechaComoCadena);
					           evaprocessesResponseDto.setRecords(ListEvalProccesAppDto);
					           evaprocessesResponseDto.setStatus(detalleStatysApp);
		                return ResponseEntity.ok(evaprocessesResponseDto);

				
		       
				} 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}/applications/{evalprocappid}")
	public ResponseEntity<?> getOneAppevalprocesses(HttpServletRequest request, @PathVariable("evalprocessid") final Integer evalprocessid,@PathVariable("evalprocappid") final Integer evalprocappid)
			throws ParseException {
				RespuestaDto respuesta = new RespuestaDto("", false);
				HttpStatus estatus = HttpStatus.FORBIDDEN;
				//EvalprocessesResponseDto evaprocessesResponseDto = new EvalprocessesResponseDto();
				EvalProcessesAppEntryRespondeDto evaprocessesAppEntryResponseDto = new EvalProcessesAppEntryRespondeDto();
				//StrategiesRecordDto
			//	ParamsDto detalleParams;
				UnitsUsersDto detalleUnits;
				UnitsUsersDto detalleProce;
				TypesUnitDto detalleTypesPer;
				TypesUnitDto detalleTypesSca;
				TypesUnitDto detalleTypesApp;
				TypesUnitDto detalleTypesReq;
				
				EvalProccesAppDto detalleEvalProccesAppDto=null;
				
				StrategiesRecordDto detalleRecord=null;
				StrategyDetDto detalleStrategy;
				OperationlineDto  detalletype,detalleFacility,detalledependencypar,detallerequired,detalleperiodo;
	    		 
				TypeStrategiDetDto detalleTypeStrategy;
				StrategiesDependencyDetDto detalleTipoDependencia;
			     List<UnitsUsersDto> listasUnits = new ArrayList<>();
			     List<EvalProccesAppDto> ListEvalProccesAppDto= new ArrayList<>();
			     List<UnitsUsersDto> listasProcess = new ArrayList<>();
			     
			     List<TypesUnitDto> listasTypesPeriodo = new ArrayList<>();
			     List<TypesUnitDto> listasTypesScale = new ArrayList<>();
			     List<TypesUnitDto> listasTypesApp = new ArrayList<>();
			     List<TypesUnitDto> listasTypesRequired = new ArrayList<>();
			     List<EvalProcessesAppEntryRespondeDto> listasEvalResponseDto= 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;
			        
			        int rolisvalidDRP;			      
			        int idrol,searchIdStrategyGeneral,searchUnitid;
			   	 
					  
			     // String searchModule = "";
				  int searchStatus = 0;
				 
				  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 (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 existeApp =  applicationsRepository.existsById(evalprocappid);
					 boolean existeApp =  evalprocappsRepository.existsById(evalprocappid);
					 /*  if (!existeApp) {
				    	    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);
				    	  
				      } 		*/
				
					String SentenciaBase1 = " SELECT "
							+ "    ea.id, "
							+ "    ap.id AS idapp, "
							+ "    ap.name AS nameapp, "
							+ "    pr4.descr3, "
							+ "    pr4.valor3, "
							+ "    fa.id AS idinstala, "
							+ "    fa.name AS nameinstala, "
							+ "    pr.descr, "
							+ "    pr.valor, "
							+ "    pr.filtro,"
							+ "    (ea.qty / CAST(pr.filtro AS INTEGER)) AS quantity, "
							+ "    pr2.descr1 AS desdepen, "
							+ "    pr2.valor1 AS valordepen, "
							+ "    pr3.descr2 AS desrequired, "
							+ "    pr3.valor2 AS valorrequired "
							+ " FROM "
							+ "    main.evalprocesses ep "
							+ " JOIN "
							+ "    main.evalprocapps ea ON ep.id = ea.evalprocessid "
							+ " JOIN "
							+ "    main.applications ap ON ea.applicationid = ap.id "
							+ " JOIN "
							+ "    main.facilities fa ON ap.facilityid = fa.id "
							+ " LEFT JOIN ( "
							+ "    SELECT "
							+ "        elemento ->> 'dsc' AS descr3, "
							+ "        elemento ->> 'value' AS valor3 "
							+ "    FROM "
							+ "        main.params p, "
							+ "        jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
							+ "    WHERE "
							+ "        p.paramname = 'APPS_TYPE'"
							+ ") pr4 ON ap.apptypepar = pr4.valor3 "
							+ " LEFT JOIN ( "
							+ "    SELECT "
							+ "        elemento ->> 'dsc' AS descr, "
							+ "        elemento ->> 'value' AS valor, "
							+ "        elemento ->> 'filter' AS filtro "
							+ "    FROM "
							+ "        main.params p, "
							+ "        jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
							+ "    WHERE "
							+ "        p.paramname = 'EVALPROC_PERIOD' "
							+ ") pr ON ea.evalprocappperiodpar = pr.valor "
							+ " LEFT JOIN ( "
							+ "    SELECT "
							+ "        elemento ->> 'dsc' AS descr1, "
							+ "        elemento ->> 'value' AS valor1 "
							+ "    FROM "
							+ "        main.params p, "
							+ "        jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
							+ "    WHERE "
							+ "        p.paramname = 'EVALPROC_SCALEAPP' "
							+ ") pr2 ON ea.evalprocappdependencypar = pr2.valor1 "
							+ " LEFT JOIN ( "
							+ "    SELECT "
							+ "        elemento ->> 'dsc' AS descr2, "
							+ "        elemento ->> 'value' AS valor2 "
							+ "    FROM "
							+ "        main.params p, "
							+ "        jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
							+ "    WHERE "
							+ "        p.paramname = 'EVALPROC_YESNO' "
							+ ") pr3 ON ea.evalprocapprequiredpar = pr3.valor2 "
							+ " WHERE "
							+ " ep.id = " + evalprocessid + " ";
					
					String exiteApp =  "  AND ea.id = " + evalprocappid + " ";
							
					String order =  " ORDER BY  ap.name ASC";
					String SentenciaBase="";
					
					if (!existeApp) {
						
						if (evalprocappid==0) {
							SentenciaBase = SentenciaBase1 + exiteApp + 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 + exiteApp + order;
						
					}
					
					//if (evalprocappid==0) {
						//SentenciaBase = SentenciaBase1 + exiteApp + order;
						
				//	}
				
					
					String queryPeriodo = " 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 = 'EVALPROC_PERIOD' ";
					
					String queryScale =" SELECT elemento ->> 'dsc' AS descr1,elemento ->> 'value' AS valor1 "
							+ " FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
							+ " WHERE p.paramname = 'EVALPROC_SCALEAPP' ";
					
					String queryTypeApp = " SELECT elemento ->> 'dsc' AS descr3,elemento ->> 'value' AS valor3 "
							+ " FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
							+ " WHERE p.paramname = 'APPS_TYPE' ";
					
					String queryRequired = " SELECT elemento ->> 'dsc' AS descr2,elemento ->> 'value' AS valor2 "
							+ " FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
							+ " WHERE p.paramname = 'EVALPROC_YESNO' ";
					
					
									
					 String QueryTotal = "";
					 QueryTotal = SentenciaBase;
 					
					 	 
					 Query query = entityManager.createNativeQuery(QueryTotal);
					  cuantosregistro = (long) jdbcTemplate.queryForList(QueryTotal).size();
					       
					       query = entityManager.createNativeQuery(QueryTotal);
					       //query.setFirstResult(offsetIn);
						   //query.setMaxResults(numofrecordsIn);
						   List<Object[]> listacompleta = query.getResultList();
						  ListEvalProccesAppDto= new ArrayList<>();
						  
				    		   for (Object[] reg : listacompleta) {
				    		 
				    		   detalleEvalProccesAppDto = new EvalProccesAppDto();
				    		   detalleRecord = new StrategiesRecordDto();
				    		   detalletype = new  OperationlineDto();
				    		   detalleFacility= new  OperationlineDto();
				    		   detalledependencypar= new  OperationlineDto();
				    		   detallerequired= new  OperationlineDto();
				    		   detalleperiodo= new  OperationlineDto();
				    		   
				    		   
				    		   detalleEvalProccesAppDto.setId((int) reg[0]);
				    		   detalleEvalProccesAppDto.setApplicationid((int) reg[1]);
				    		   detalleEvalProccesAppDto.setName((String) reg[2]);
				    		   ///seteo los valores del type de app
				    		   String idtypeString = (String) reg[4];
				    		   Integer valorid = Integer.parseInt(idtypeString);
				    		   detalletype.setId(valorid);
				    		   detalletype.setName((String) reg[3]);
				    		   //seteo el facility
				    		   detalleFacility.setId((int) reg[5]);
				    		   detalleFacility.setName((String) reg[6]);
				    		  //seteo el dependency 
				    		   String idtypeString2 = (String) reg[12];
				    		   Integer valorid2 = Integer.parseInt(idtypeString2);
				    		   detalledependencypar.setId(valorid2);
				    		   detalledependencypar.setName((String) reg[11]);
				    		   //seteo el requiredpar 
				    		   String idtypeString3 = (String) reg[14];
				    		   Integer valorid3 = Integer.parseInt(idtypeString3);
				    		   detallerequired.setId(valorid3);
				    		   detallerequired.setName((String) reg[13]);
				    		   Integer cantidadint = (int) reg[10];
				    		   String cantidadCadena = cantidadint.toString();
				    		   detalleEvalProccesAppDto.setQty(cantidadCadena);
				    		   //seteo el periodo
				    		   String idtypeString4 = (String) reg[8];
				    		   Integer valorid4 = Integer.parseInt(idtypeString4);
				    		   detalleperiodo.setId(valorid4);
				    		   detalleperiodo.setName((String) reg[7]);
				    		
				    		   detalleEvalProccesAppDto.setFacility(detalleFacility);
				    		   detalleEvalProccesAppDto.setDependencypar(detalledependencypar);
				    		   detalleEvalProccesAppDto.setPeriodpar(detalleperiodo);
				    		   detalleEvalProccesAppDto.setRequiredpar(detallerequired);
				    		   detalleEvalProccesAppDto.setType(detalletype);
				    		   				    		   				    								    								    				    	
					    	  
				    		   ListEvalProccesAppDto.add(detalleEvalProccesAppDto);
				    	   }
				    		//  TypesUnitDto detalleTypesPer;
							//	TypesUnitDto detalleTypesSca;
							//	TypesUnitDto detalleTypesApp;
							//	TypesUnitDto detalleTypesReq;
				    		 //    List<TypesUnitDto> listasTypesPeriodo = new ArrayList<>();
							  //   List<TypesUnitDto> listasTypesScale = new ArrayList<>();
							  //   List<TypesUnitDto> listasTypesApp = new ArrayList<>();
							   //  List<TypesUnitDto> listasTypesRequired = new ArrayList<>();
				    		   Query queryPeri = entityManager.createNativeQuery(queryPeriodo);
						       List<Object[]> listaperiodo= queryPeri.getResultList();
						       for (Object[] types : listaperiodo) {
						    	   detalleTypesPer = new TypesUnitDto();
						    	  
						    	   detalleTypesPer.setDsc((String) types[0]);
						    	   detalleTypesPer.setValue((String) types[1]);
						    	   listasTypesPeriodo.add(detalleTypesPer);
						       }
						       
						       Query querySca = entityManager.createNativeQuery(queryScale);
						       List<Object[]> listascale= querySca.getResultList();
						       for (Object[] types : listascale) {
						    	   detalleTypesSca = new TypesUnitDto();
						    	  
						    	   detalleTypesSca.setDsc((String) types[0]);
						    	   detalleTypesSca.setValue((String) types[1]);
						    	   listasTypesScale.add(detalleTypesSca);
						       }
						       
						       Query queryTipoApp = entityManager.createNativeQuery(queryTypeApp);
						       List<Object[]> listaTypeApp= queryTipoApp.getResultList();
						       for (Object[] types : listaTypeApp) {
						    	   detalleTypesApp = new TypesUnitDto();
						    	  
						    	   detalleTypesApp.setDsc((String) types[0]);
						    	   detalleTypesApp.setValue((String) types[1]);
						    	   listasTypesApp.add(detalleTypesApp);
						       }
						       
						       Query queryReq = entityManager.createNativeQuery(queryRequired);
						       List<Object[]> listaRequired= queryReq.getResultList();
						       for (Object[] types : listaRequired) {
						    	   detalleTypesReq = new TypesUnitDto();
						    	  
						    	   detalleTypesReq.setDsc((String) types[0]);
						    	   detalleTypesReq.setValue((String) types[1]);
						    	   listasTypesRequired.add(detalleTypesReq);
						       }
						       
						       evaprocessesAppEntryResponseDto.setEntry(detalleEvalProccesAppDto);
						       evaprocessesAppEntryResponseDto.setApptype(listasTypesApp);
						       evaprocessesAppEntryResponseDto.setPeriods(listasTypesPeriodo);
						       evaprocessesAppEntryResponseDto.setRequired(listasTypesRequired);
						       evaprocessesAppEntryResponseDto.setScale(listasTypesScale);
				    					    					    	
				    		  
		                return ResponseEntity.ok(evaprocessesAppEntryResponseDto);

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