package com.dacrt.SBIABackend.controler;

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

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.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.EntryRecursoDto;
import com.dacrt.SBIABackend.dto.EntryRecursoDto2;
import com.dacrt.SBIABackend.dto.EvalProcessRecordsDto;
import com.dacrt.SBIABackend.dto.EvalProcessRequestDto;
import com.dacrt.SBIABackend.dto.EvalProcessResponseDto;
import com.dacrt.SBIABackend.dto.EvalRecursoRecordsDto;
import com.dacrt.SBIABackend.dto.EvalUnitsResResponseDto;
import com.dacrt.SBIABackend.dto.EvalprocimpactsActualizarDto;
import com.dacrt.SBIABackend.dto.EvalunitsResourceActualizarDto;
import com.dacrt.SBIABackend.dto.OperationlineDto;
import com.dacrt.SBIABackend.dto.ProcessResponDto;
import com.dacrt.SBIABackend.dto.QuantitiesDto;
import com.dacrt.SBIABackend.dto.QuantitiesDto2;
import com.dacrt.SBIABackend.dto.RangesRecursosDto;
import com.dacrt.SBIABackend.dto.RangesRecursosDto2;
import com.dacrt.SBIABackend.dto.StatusDto;
import com.dacrt.SBIABackend.dto.StatusDto2;
import com.dacrt.SBIABackend.dto.StatusResponseDto;
import com.dacrt.SBIABackend.dto.TotalsResponseDto;
import com.dacrt.SBIABackend.dto.UnitsResponseDto;
import com.dacrt.SBIABackend.entity.Evalprocesses;
import com.dacrt.SBIABackend.entity.Evalprocimpacts;
import com.dacrt.SBIABackend.entity.Evalprocsupliers;
import com.dacrt.SBIABackend.entity.Evalunitres;
import com.dacrt.SBIABackend.entity.Evalunits;
import com.dacrt.SBIABackend.entity.Resources;
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.EvalunitresRepository;
import com.dacrt.SBIABackend.repository.EvalunitsRepository;
import com.dacrt.SBIABackend.repository.ResourceRepository;
import com.dacrt.SBIABackend.security.dto.AuditRequestDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesAllDto;
import com.dacrt.SBIABackend.security.dto.RespuestaMsgDto;
import com.dacrt.SBIABackend.security.dto.RespuestaValueDto;
import com.dacrt.SBIABackend.security.entity.Params;
import com.dacrt.SBIABackend.security.entity.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 EvalunitresController {
	@Autowired
	private ParamsRepository paramsRepository;

	@Autowired
	private UsersRepository usersRepository;

	@Autowired
	private AuditRepository auditRepository;

	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;

	@Autowired
	UsersService usersService;

	@Autowired
	ParamsService paramsService;

	@Autowired
	SecurityService securityService;

	@Autowired
	MenuService menuService;

	@Autowired
	CampaignsRepository campaignsRepository;

	@PersistenceContext
	private EntityManager entityManager;

	@Autowired
	ResourceRepository resourceRepository;
	
	@Autowired
	EvalunitsRepository evalunitsRepository;

	@Autowired
	EvalunitresRepository evalunitresRepository;

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

	@GetMapping("/evalunits/{evalunitid}/resources")
	public ResponseEntity<EvalUnitsResResponseDto> ListarEvalUnitsRes(HttpServletRequest request,
			@PathVariable("evalunitid") final Integer evalunitid) 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);

		int numofrecordsIn = 0;
		int rolisvalid = 0;

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

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

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

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

				try {

					Query query4;
					StatusDto2 status = new StatusDto2();
					String SentenciaBase2 = "SELECT eu.resourcest,"
							+ "                     CASE WHEN eu.resourcest=0 THEN 'Abierta' ELSE 'Completada' END AS status "
							+ "              FROM main.evalunits eu " + "              WHERE eu.id = :evalunitid ";

					query4 = entityManager.createNativeQuery(SentenciaBase2);
					query4.setParameter("evalunitid", evalunitid);
					cuantosregistro = 0L;
					cuantosregistro = (long) query4.getResultList().size();
					List<Object[]> resultadosEstatus = query4.getResultList();
					if (cuantosregistro > 0) {
						for (Object[] fila : resultadosEstatus) {
							status.setId((Integer) fila[0]);
							status.setName((String) fila[1]);
						}
					}

					Query query;
					Integer idUsuario2 = encontreSessionUsuario.get().getId();
					String QueryTotal = "";
					// Luego consulto la tabla EvalUnits

					String SentenciaBase = "SELECT evunire.id, " + "		evunire.resourceid,  " + "		res.name,  "
							+ "		evunire.condition,  " + "		evunire.note,  " + "		evunire.qtytotal, "
							+ "		evunire.qtykey, " + "		'0 a 2 Hrs' label1, " + "		1 weight1, "
							+ "		evunire.qtyrange1, " + "		'2 a 4 Hrs' label2, " + "		1 weight2, "
							+ "		evunire.qtyrange2, " + "		'4 a 8 Hrs' label3, " + "		1 weight3, "
							+ "		evunire.qtyrange3, " + "		'8 a 12 Hrs' label4, " + "		1 weight4, "
							+ "		evunire.qtyrange4, " + "		'Día 1' label5, " + "		24 weight5, "
							+ "		evunire.qtyrange5, " + "		'Día 2' label6, " + "		24 weight6, "
							+ "		evunire.qtyrange6, " + "		'Día 3' label7, " + "		24 weight7, "
							+ "		evunire.qtyrange7, " + "		'Día 4' label8, " + "		24 weight8, "
							+ "		evunire.qtyrange8, " + "		'Día 5' label9, " + "		24 weight9, "
							+ "		evunire.qtyrange9, " + "		'Día 6' label10, " + "		24 weight10, "
							+ "		evunire.qtyrange10, " + "		'Día 7' label11, " + "		24 weight11, "
							+ "		evunire.qtyrange11 " 
							+ "  FROM main.evalunits evuni, "
							+ "       main.campaignunits cu,  " 
							+ "	      main.evalunitres evunire, "
							+ "	      main.resources res, " 
							+ "	      main.userunits us " 
							+ "  WHERE evuni.id=evunire.evalunitid "
							+ "  AND evalunitid= :evalunitid "
							+ "  AND evuni.campaingunitid = cu.id " 
							+ "  AND us.unitid=cu.unitid  "
							+ "  AND us.userid = :idUsuario " 
							+ "  AND res.id=evunire.resourceid " 
							+ "order by 1 ASC";
					System.out.println(SentenciaBase);
					query = entityManager.createNativeQuery(SentenciaBase);
					query.setParameter("idUsuario", idUsuario2);
					query.setParameter("evalunitid", evalunitid);
					cuantosregistro = (long) query.getResultList().size();
					List<Object[]> resultados = query.getResultList();
					EvalRecursoRecordsDto evalRecursoRecordsDto = new EvalRecursoRecordsDto();
					List<EvalRecursoRecordsDto> evalRecursoRecordsDtoList = new ArrayList();
					QuantitiesDto quantitiesDto = new QuantitiesDto();
					RangesRecursosDto rangesRecursosDto = new RangesRecursosDto();
					List<RangesRecursosDto> rangesRecursosDtoList = new ArrayList();
					EvalUnitsResResponseDto evalUnitsResResponseDto = new EvalUnitsResResponseDto();
					if (cuantosregistro > 0) {
						for (Object[] fila : resultados) {
							evalRecursoRecordsDto.setId((int) fila[0]);
							evalRecursoRecordsDto.setResourceid((int) fila[1]);
							evalRecursoRecordsDto.setName((String) fila[2]);
							evalRecursoRecordsDto.setCondition((String) fila[3] == null ? "" : (String) fila[3]);
							evalRecursoRecordsDto.setNote((String) fila[4] == null ? "" : (String) fila[4]);
							quantitiesDto.setTotal((int) fila[5]);
							quantitiesDto.setKey((int) fila[6]);
							rangesRecursosDto.setId(1);
							rangesRecursosDto.setLabel((String) fila[7]);
							rangesRecursosDto.setWeight((int) fila[8]);
							rangesRecursosDto.setQty((int) fila[9]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto();
							rangesRecursosDto.setId(2);
							rangesRecursosDto.setLabel((String) fila[10]);
							rangesRecursosDto.setWeight((int) fila[11]);
							rangesRecursosDto.setQty((int) fila[12]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto();
							rangesRecursosDto.setId(3);
							rangesRecursosDto.setLabel((String) fila[13]);
							rangesRecursosDto.setWeight((int) fila[14]);
							rangesRecursosDto.setQty((int) fila[15]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto();
							rangesRecursosDto.setId(4);
							rangesRecursosDto.setLabel((String) fila[16]);
							rangesRecursosDto.setWeight((int) fila[17]);
							rangesRecursosDto.setQty((int) fila[18]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto();
							rangesRecursosDto.setId(5);
							rangesRecursosDto.setLabel((String) fila[19]);
							rangesRecursosDto.setWeight((int) fila[20]);
							rangesRecursosDto.setQty((int) fila[21]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto();
							rangesRecursosDto.setId(6);
							rangesRecursosDto.setLabel((String) fila[22]);
							rangesRecursosDto.setWeight((int) fila[23]);
							rangesRecursosDto.setQty((int) fila[24]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto();
							rangesRecursosDto.setId(7);
							rangesRecursosDto.setLabel((String) fila[25]);
							rangesRecursosDto.setWeight((int) fila[26]);
							rangesRecursosDto.setQty((int) fila[27]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto();
							rangesRecursosDto.setId(8);
							rangesRecursosDto.setLabel((String) fila[28]);
							rangesRecursosDto.setWeight((int) fila[29]);
							rangesRecursosDto.setQty((int) fila[30]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto();
							rangesRecursosDto.setId(9);
							rangesRecursosDto.setLabel((String) fila[31]);
							rangesRecursosDto.setWeight((int) fila[32]);
							rangesRecursosDto.setQty((int) fila[33]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto();
							rangesRecursosDto.setId(10);
							rangesRecursosDto.setLabel((String) fila[34]);
							rangesRecursosDto.setWeight((int) fila[35]);
							rangesRecursosDto.setQty((int) fila[36]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto();
							rangesRecursosDto.setId(11);
							rangesRecursosDto.setLabel((String) fila[37]);
							rangesRecursosDto.setWeight((int) fila[38]);
							rangesRecursosDto.setQty((int) fila[39]);
							rangesRecursosDtoList.add(rangesRecursosDto);
							quantitiesDto.setRanges(rangesRecursosDtoList);

							evalRecursoRecordsDto.setQuantities(quantitiesDto);

							evalRecursoRecordsDtoList.add(evalRecursoRecordsDto);
							evalRecursoRecordsDto = new EvalRecursoRecordsDto();
							quantitiesDto = new QuantitiesDto();
							rangesRecursosDto = new RangesRecursosDto();
						}

						evalUnitsResResponseDto.setNumofrecords(cuantosregistro);
						evalUnitsResResponseDto.setRecords(evalRecursoRecordsDtoList);
						evalUnitsResResponseDto.setStatus(status);
						evalUnitsResResponseDto.setSessionvalidthru(fechaComoCadena);

					} else {
						evalUnitsResResponseDto.setNumofrecords(cuantosregistro);
						evalUnitsResResponseDto.setRecords(evalRecursoRecordsDtoList);
						evalUnitsResResponseDto.setStatus(status);
						evalUnitsResResponseDto.setSessionvalidthru(fechaComoCadena);
					}

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

	@GetMapping("/evalunits/{evalunitid}/resources/{evalunitresid}")
	public ResponseEntity<EntryRecursoDto2> ObtenerUnoEvalUnitsRes(HttpServletRequest request,
			@PathVariable("evalunitid") final Integer evalunitid,
			@PathVariable("evalunitresid") final Integer evalunitresid) 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);

		int numofrecordsIn = 0;
		int rolisvalid = 0;

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

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

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

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

				try {

					Query query4;
					StatusDto2 status = new StatusDto2();
					String SentenciaBase2 = "SELECT eu.resourcest,"
							+ "                     CASE WHEN eu.resourcest=0 THEN 'Abierta' ELSE 'Completada' END AS status "
							+ "              FROM main.evalunits eu " + "              WHERE eu.id = :evalunitid ";

					query4 = entityManager.createNativeQuery(SentenciaBase2);
					query4.setParameter("evalunitid", evalunitid);
					cuantosregistro = 0L;
					cuantosregistro = (long) query4.getResultList().size();
					List<Object[]> resultadosEstatus = query4.getResultList();
					if (cuantosregistro > 0) {
						for (Object[] fila : resultadosEstatus) {
							status.setId((Integer) fila[0]);
							status.setName((String) fila[1]);
						}
					}

					Query query;
					Integer idUsuario2 = encontreSessionUsuario.get().getId();
					String QueryTotal = "";
					// Luego consulto la tabla EvalUnits

					String SentenciaBase = "SELECT evunire.id, " + "		evunire.resourceid,  " + "		res.name,  "
							+ "		evunire.condition,  " + "		evunire.note,  " + "		evunire.qtytotal, "
							+ "		evunire.qtykey, " + "		'0 a 2 Hrs' label1, " + "		evunire.qtyrange1, "
							+ "		'2 a 4 Hrs' label2, " + "		evunire.qtyrange2, "
							+ "		'4 a 8 Hrs' label3, " + "		evunire.qtyrange3, "
							+ "		'8 a 12 Hrs' label4, " + "		evunire.qtyrange4, " + "		'Día 1' label5, "
							+ "		evunire.qtyrange5, " + "		'Día 2' label6, " + "		evunire.qtyrange6, "
							+ "		'Día 3' label7, " + "		evunire.qtyrange7, " + "		'Día 4' label8, "
							+ "		evunire.qtyrange8, " + "		'Día 5' label9, " + "		evunire.qtyrange9, "
							+ "		'Día 6' label10, " + "		evunire.qtyrange10, " + "		'Día 7' label11, "
							+ "		evunire.qtyrange11 " + "FROM main.evalunits evuni, "
							+ "    main.campaignunits cu,  " + "	main.evalunitres evunire, "
							+ "	main.resources res, " + "	main.userunits us " + "WHERE evuni.id=evunire.evalunitid "
							+ "AND evuni.campaingunitid = cu.id " + "AND us.unitid=cu.unitid  "
							+ "and us.userid = :idUsuario " + "AND res.id=evunire.resourceid "
							+ "AND evunire.evalunitid= :evalunitid " + "AND evunire.id= :evalunitresid ";
					System.out.println(SentenciaBase);
					query = entityManager.createNativeQuery(SentenciaBase);
					query.setParameter("idUsuario", idUsuario2);
					query.setParameter("evalunitid", evalunitid);
					query.setParameter("evalunitresid", evalunitresid);
					cuantosregistro = (long) query.getResultList().size();
					List<Object[]> resultados = query.getResultList();
					EntryRecursoDto entryRecursoDto = new EntryRecursoDto();
					EntryRecursoDto2 entryRecursoDto2 = new EntryRecursoDto2();
					List<EvalRecursoRecordsDto> evalRecursoRecordsDtoList = new ArrayList();
					QuantitiesDto2 quantitiesDto = new QuantitiesDto2();
					RangesRecursosDto2 rangesRecursosDto = new RangesRecursosDto2();
					List<RangesRecursosDto2> rangesRecursosDtoList = new ArrayList();
					EvalUnitsResResponseDto evalUnitsResResponseDto = new EvalUnitsResResponseDto();
					if (cuantosregistro > 0) {
						for (Object[] fila : resultados) {
							entryRecursoDto.setId((int) fila[0]);
							entryRecursoDto.setResourceid((int) fila[1]);
							entryRecursoDto.setName((String) fila[2]);
							entryRecursoDto.setCondition((String) fila[3] == null ? "" : (String) fila[3]);
							entryRecursoDto.setNote((String) fila[4] == null ? "" : (String) fila[4]);
							quantitiesDto.setTotal((int) fila[5]);
							quantitiesDto.setKey((int) fila[6]);
							rangesRecursosDto.setId(1);
							rangesRecursosDto.setLabel((String) fila[7]);
							rangesRecursosDto.setQty((int) fila[8]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto2();
							rangesRecursosDto.setId(2);
							rangesRecursosDto.setLabel((String) fila[9]);
							rangesRecursosDto.setQty((int) fila[10]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto2();
							rangesRecursosDto.setId(3);
							rangesRecursosDto.setLabel((String) fila[11]);
							rangesRecursosDto.setQty((int) fila[12]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto2();
							rangesRecursosDto.setId(4);
							rangesRecursosDto.setLabel((String) fila[13]);
							rangesRecursosDto.setQty((int) fila[14]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto2();
							rangesRecursosDto.setId(5);
							rangesRecursosDto.setLabel((String) fila[15]);
							rangesRecursosDto.setQty((int) fila[16]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto2();
							rangesRecursosDto.setId(6);
							rangesRecursosDto.setLabel((String) fila[17]);
							rangesRecursosDto.setQty((int) fila[18]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto2();
							rangesRecursosDto.setId(7);
							rangesRecursosDto.setLabel((String) fila[19]);
							rangesRecursosDto.setQty((int) fila[20]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto2();
							rangesRecursosDto.setId(8);
							rangesRecursosDto.setLabel((String) fila[21]);
							rangesRecursosDto.setQty((int) fila[22]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto2();
							rangesRecursosDto.setId(9);
							rangesRecursosDto.setLabel((String) fila[23]);
							rangesRecursosDto.setQty((int) fila[24]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto2();
							rangesRecursosDto.setId(10);
							rangesRecursosDto.setLabel((String) fila[25]);
							rangesRecursosDto.setQty((int) fila[26]);
							rangesRecursosDtoList.add(rangesRecursosDto);

							rangesRecursosDto = new RangesRecursosDto2();
							rangesRecursosDto.setId(11);
							rangesRecursosDto.setLabel((String) fila[27]);
							rangesRecursosDto.setQty((int) fila[28]);
							rangesRecursosDtoList.add(rangesRecursosDto);
							quantitiesDto.setRanges(rangesRecursosDtoList);

							entryRecursoDto.setQuantities(quantitiesDto);
						}

						entryRecursoDto2.setEntry(entryRecursoDto);

					} else {
						respuesta.setMsg("Registro No Encontrado");
						estatus = HttpStatus.NOT_FOUND;
						return new ResponseEntity(respuesta, estatus);
					}

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

	@PostMapping({ "/evalunits/{evalunitid}/resources/{evalunitresid}" })
	public ResponseEntity<?> actualizarEvalunitsResource(HttpServletRequest request,
			@RequestBody EvalunitsResourceActualizarDto evalunitsResourceActualizarDto,
			@PathVariable("evalunitid") final Integer evalunitid,
			@PathVariable("evalunitresid") final Integer evalunitresid) 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);
		AuditRequestDto auditDto = new AuditRequestDto();

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

		Date fecha3 = new Date();
		SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata2 = formatter.format(fecha3);
		Date fechaDate2 = formatter.parse(dataFormattata2);

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

//Verifico la session
		if (sessionid == null) {
			respuesta.setMsg("Llamada al servicio malformado");
			estatus = HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		} 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);
			// 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(), 201);
				if (rolisvalid == 0) {
					respuesta.setMsg("No tiene los Privilegios");
					estatus = HttpStatus.FORBIDDEN;
					return new ResponseEntity(respuesta, estatus);
				}
				

			    String SalidaCond= usersService.verificarCaracteresValidosConRegex(evalunitsResourceActualizarDto.getCondition());
			    String SalidaNota = usersService.verificarCaracteresValidosConRegex(evalunitsResourceActualizarDto.getNote());
			   // String SalidaCod = usersService.verificarCaracteresValidosConRegex(datosUnidad.getRef());
			    
			    if (SalidaCond=="NOOK" || SalidaNota=="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);
				  }  
				try {
					//Valida que el id de recurso no sea 0
					if (evalunitsResourceActualizarDto.getResourceid()==0) {
						respuesta.setMsg("Llamada al servicio malformado");
						estatus = HttpStatus.BAD_REQUEST;
						return new ResponseEntity(respuesta, estatus);
	 				}
					 //Compara si los valores son mayores a cada campo
					 Integer compa1 = Integer.compare(Integer.parseInt(evalunitsResourceActualizarDto.getRange01()), Integer.parseInt(evalunitsResourceActualizarDto.getRange02()));
	 				 Integer compa2 = Integer.compare(Integer.parseInt(evalunitsResourceActualizarDto.getRange02()), Integer.parseInt(evalunitsResourceActualizarDto.getRange03()));
	 				 Integer compa3 = Integer.compare(Integer.parseInt(evalunitsResourceActualizarDto.getRange03()), Integer.parseInt(evalunitsResourceActualizarDto.getRange04()));
	 				 Integer compa4 = Integer.compare(Integer.parseInt(evalunitsResourceActualizarDto.getRange04()), Integer.parseInt(evalunitsResourceActualizarDto.getRange05()));
	 				 Integer compa5 = Integer.compare(Integer.parseInt(evalunitsResourceActualizarDto.getRange05()), Integer.parseInt(evalunitsResourceActualizarDto.getRange06()));
	 				 Integer compa6 = Integer.compare(Integer.parseInt(evalunitsResourceActualizarDto.getRange06()), Integer.parseInt(evalunitsResourceActualizarDto.getRange07()));
	 				 Integer compa7 = Integer.compare(Integer.parseInt(evalunitsResourceActualizarDto.getRange07()), Integer.parseInt(evalunitsResourceActualizarDto.getRange08()));
	 				 Integer compa8 = Integer.compare(Integer.parseInt(evalunitsResourceActualizarDto.getRange08()), Integer.parseInt(evalunitsResourceActualizarDto.getRange09()));
	 			  	 Integer compa9 = Integer.compare(Integer.parseInt(evalunitsResourceActualizarDto.getRange09()), Integer.parseInt(evalunitsResourceActualizarDto.getRange10()));
	 				 Integer compa10 = Integer.compare(Integer.parseInt(evalunitsResourceActualizarDto.getRange10()), Integer.parseInt(evalunitsResourceActualizarDto.getRange11()));
	 		
	 				 //Si es mayor debe arrojar BAD_REQUEST
	 				if (compa1==1 || compa2==1 || compa3==1 || compa4==1 || compa5==1 || compa6==1 || compa7==1 || compa8==1 || compa9==1 || compa10==1 ) {
	 					respuesta.setMsg("Llamada al servicio malformado");
						estatus = HttpStatus.BAD_REQUEST;
						return new ResponseEntity(respuesta, estatus);
	 				}
	 				
	 				//Compara cantidad de total con la cantidad de campo clave si el total es menor al campo clave arroja BAD_REQUEST
	 				Integer compatotalkey = Integer.compare(Integer.parseInt(evalunitsResourceActualizarDto.getQtytotal()), Integer.parseInt(evalunitsResourceActualizarDto.getQtykey()));

	 				  if (compatotalkey==-1) {
	 					 respuesta.setMsg("Llamada al servicio malformado");
						 estatus = HttpStatus.BAD_REQUEST;
						 return new ResponseEntity(respuesta, estatus);
	 				  }
	 				 
	 				  //Valida que los campos no sean vacìos y que sean positivos
				if (evalunitsResourceActualizarDto.getResourceid() == null
						|| evalunitsResourceActualizarDto.getQtykey() == null
						|| evalunitsResourceActualizarDto.getQtytotal() == null
						|| evalunitsResourceActualizarDto.getRange01() == null
						|| evalunitsResourceActualizarDto.getRange02() == null
						|| evalunitsResourceActualizarDto.getRange03() == null
						|| evalunitsResourceActualizarDto.getRange04() == null
						|| evalunitsResourceActualizarDto.getRange05() == null
						|| evalunitsResourceActualizarDto.getRange06() == null
						|| evalunitsResourceActualizarDto.getRange07() == null
						|| evalunitsResourceActualizarDto.getRange08() == null
						|| evalunitsResourceActualizarDto.getRange09() == null
						|| evalunitsResourceActualizarDto.getRange10() == null
							|| evalunitsResourceActualizarDto.getRange11() == null
							|| Integer.parseInt(evalunitsResourceActualizarDto.getQtykey())   < 0
							|| Integer.parseInt(evalunitsResourceActualizarDto.getQtytotal()) < 0
							|| Integer.parseInt(evalunitsResourceActualizarDto.getRange01())  < 0
							|| Integer.parseInt(evalunitsResourceActualizarDto.getRange02())  < 0
							|| Integer.parseInt(evalunitsResourceActualizarDto.getRange03())  < 0
							|| Integer.parseInt(evalunitsResourceActualizarDto.getRange04())  < 0
							|| Integer.parseInt(evalunitsResourceActualizarDto.getRange05())  < 0
							|| Integer.parseInt(evalunitsResourceActualizarDto.getRange06())  < 0
							|| Integer.parseInt(evalunitsResourceActualizarDto.getRange07())  < 0
							|| Integer.parseInt(evalunitsResourceActualizarDto.getRange08())  < 0
							|| Integer.parseInt(evalunitsResourceActualizarDto.getRange09())  < 0
							|| Integer.parseInt(evalunitsResourceActualizarDto.getRange10())  < 0
							|| Integer.parseInt(evalunitsResourceActualizarDto.getRange11())  < 0) {
					respuesta.setMsg("Llamada al servicio malformado");
					estatus = HttpStatus.BAD_REQUEST;
					return new ResponseEntity(respuesta, estatus);
				}
				}catch (NumberFormatException e) {
					respuesta.setMsg("Llamada al servicio malformado");
					estatus = HttpStatus.BAD_REQUEST;
					return new ResponseEntity(respuesta, estatus);
				}
				
				// Verifico si existe el id de la Evaluación de unidad
				Optional<Evalunits> obtunits = evalunitsRepository.findById(evalunitid);
				Evalprocimpacts evalprocimpacts = new Evalprocimpacts();
				// Verifico si encontre el proceso
				if (!obtunits.isPresent()) {
					respuesta.setMsg("Registro no encontrado");
					return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
				}
				String module, Descmodule = "";

				Query query;

				try {

					if (evalunitresid != 0) {// actualizar recurso
						try {
							// verifico si tiene el privilegio
							rolisvalid = auditRepository
									.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 211);
							if (rolisvalid == 0) {
								respuesta.setMsg("No tiene los Privilegios");
								estatus = HttpStatus.FORBIDDEN;
								return new ResponseEntity(respuesta, estatus);
							}

							// Verifico si existe el id de la Evaluación de unidades
							Optional<Evalunitres> obtUnitsres = evalunitresRepository.findByEvalunitresource2(evalunitid,
									evalunitresid);
							Evalunitres evalunitres2 = new Evalunitres();
							Evalunitres evalunitres3 = new Evalunitres();
							Evalunits evalunits = new Evalunits();
							Resources resourcs = new Resources();
							// Verifico si encontre el proceso
							if (!obtUnitsres.isPresent()) {
								respuesta.setMsg("Registro no encontrado");
								return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
							}

							Optional<Evalunits> obtunit2 = evalunitsRepository.findById(evalunitid);
							Optional<Resources> obtresource = resourceRepository.findById(evalunitsResourceActualizarDto.getResourceid());
							if (!obtresource.isPresent()) {
								respuesta.setMsg("Registro No Encontrado");
								estatus = HttpStatus.NOT_FOUND;
								return new ResponseEntity(respuesta, estatus);
							}
							
							Optional<Evalunitres> obtUnitsres2 = evalunitresRepository.findByEvalunitresource(evalunitid,
									evalunitsResourceActualizarDto.getResourceid());
							
							if (obtUnitsres2.isPresent() && obtUnitsres2.get().getId()!=evalunitresid) {
								respuesta.setMsg("Registro duplicado");
								estatus = HttpStatus.CONFLICT;
								return new ResponseEntity(respuesta, estatus);
							}
							
							if (Integer.parseInt(evalunitsResourceActualizarDto.getQtykey())==0 &&
									evalunitsResourceActualizarDto.getCondition()!="") {
								respuesta.setMsg("Condición Clave debe estar vacía");
								estatus = HttpStatus.BAD_REQUEST;
								return new ResponseEntity(respuesta, estatus);
							}
							
							evalunits = obtunit2.get();
							resourcs= obtresource.get();
							evalunitres2=obtUnitsres.get();
							// Vamos actualizar
							evalunitres2.setNote(evalunitsResourceActualizarDto.getNote());
							evalunitres2.setCondition(evalunitsResourceActualizarDto.getCondition());
							evalunitres2.setEvalunitid(evalunits);
							evalunitres2.setResourceid(resourcs);
							evalunitres2.setQtykey(Integer.parseInt(evalunitsResourceActualizarDto.getQtykey()));
							evalunitres2.setQtytotal(Integer.parseInt(evalunitsResourceActualizarDto.getQtytotal()));
							evalunitres2.setQtyrange1(Integer.parseInt(evalunitsResourceActualizarDto.getRange01()));
							evalunitres2.setQtyrange2(Integer.parseInt(evalunitsResourceActualizarDto.getRange02()));
							evalunitres2.setQtyrange3(Integer.parseInt(evalunitsResourceActualizarDto.getRange03()));
							evalunitres2.setQtyrange4(Integer.parseInt(evalunitsResourceActualizarDto.getRange04()));
							evalunitres2.setQtyrange5(Integer.parseInt(evalunitsResourceActualizarDto.getRange05()));
							evalunitres2.setQtyrange6(Integer.parseInt(evalunitsResourceActualizarDto.getRange06()));
							evalunitres2.setQtyrange7(Integer.parseInt(evalunitsResourceActualizarDto.getRange07()));
							evalunitres2.setQtyrange8(Integer.parseInt(evalunitsResourceActualizarDto.getRange08()));
							evalunitres2.setQtyrange9(Integer.parseInt(evalunitsResourceActualizarDto.getRange09()));
							evalunitres2.setQtyrange10(Integer.parseInt(evalunitsResourceActualizarDto.getRange10()));
							evalunitres2.setQtyrange11(Integer.parseInt(evalunitsResourceActualizarDto.getRange11()));
							evalunitres2.setModifiedat(fechaDate2);
							
							evalunitres3 = evalunitresRepository.save(evalunitres2);
							// Auditoría
							module = "Evaluación de Unidades de Recursos";
							Descmodule = "Se actualizó la Evaluación de Procesos de Recursos: "
									+ evalunitres3.getId();
							auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());
							String singo1 = "(";
							String singo2 = ")";
							String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1)
									.concat(encontreSessionUsuario.get().getEmail().concat(singo2));
							auditDto.setUserref(usryemail);
							auditDto.setModule(module);
							auditDto.setDesc(Descmodule);
							auditDto.setCreatedat(fechaDate2);
							usersService.registrarAuditSesion(auditDto);

							RespuestaValueDto respuestaValueDto = new RespuestaValueDto(evalunitres3.getId());
							URI location = URI
									.create("/evalunits/" + evalunitid + "/resources/" + evalunitres3.getId());

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

						} 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 {
						try {
							// verifico si tiene el privilegio
							rolisvalid = auditRepository
									.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 212);
							if (rolisvalid == 0) {
								respuesta.setMsg("No tiene los Privilegios");
								estatus = HttpStatus.FORBIDDEN;
								return new ResponseEntity(respuesta, estatus);
							}

							// Verifico si existe el id de la Evaluación de unidades
							Optional<Evalunits> obtUnit = evalunitsRepository.findById(evalunitid);

							if (!obtUnit.isPresent()) {
								respuesta.setMsg("Registro No Encontrado");
								estatus = HttpStatus.NOT_FOUND;
								return new ResponseEntity(respuesta, estatus);
							}

							Evalunitres evalunitres2 = new Evalunitres();
							Evalunitres evalunitres3 = new Evalunitres();
							Resources resourcs = new Resources();
							
							Optional<Evalunitres> obtUnitsres = evalunitresRepository.findByEvalunitresource(evalunitid,
									evalunitsResourceActualizarDto.getResourceid());
							
							if (obtUnitsres.isPresent()) {
								respuesta.setMsg("Registro duplicado");
								estatus = HttpStatus.CONFLICT;
								return new ResponseEntity(respuesta, estatus);
							}
							
							Optional<Resources> obtresource = resourceRepository.findById(evalunitsResourceActualizarDto.getResourceid());
							if (!obtresource.isPresent()) {
								respuesta.setMsg("Registro No Encontrado");
								estatus = HttpStatus.NOT_FOUND;
								return new ResponseEntity(respuesta, estatus);
							}
							
							if (Integer.parseInt(evalunitsResourceActualizarDto.getQtykey())==0 &&
									evalunitsResourceActualizarDto.getCondition()!="") {
								respuesta.setMsg("Condición Clave debe estar vacía");
								estatus = HttpStatus.BAD_REQUEST;
								return new ResponseEntity(respuesta, estatus);
							}
							Evalunits evalunits = new Evalunits();
							evalunits = obtUnit.get();
							resourcs= obtresource.get();
							evalunitres2.setNote(evalunitsResourceActualizarDto.getNote());
							evalunitres2.setCondition(evalunitsResourceActualizarDto.getCondition());
							evalunitres2.setEvalunitid(evalunits);
							evalunitres2.setResourceid(resourcs);
							evalunitres2.setQtykey(Integer.parseInt(evalunitsResourceActualizarDto.getQtykey()));
							evalunitres2.setQtytotal(Integer.parseInt(evalunitsResourceActualizarDto.getQtytotal()));
							evalunitres2.setQtyrange1(Integer.parseInt(evalunitsResourceActualizarDto.getRange01()));
							evalunitres2.setQtyrange2(Integer.parseInt(evalunitsResourceActualizarDto.getRange02()));
							evalunitres2.setQtyrange3(Integer.parseInt(evalunitsResourceActualizarDto.getRange03()));
							evalunitres2.setQtyrange4(Integer.parseInt(evalunitsResourceActualizarDto.getRange04()));
							evalunitres2.setQtyrange5(Integer.parseInt(evalunitsResourceActualizarDto.getRange05()));
							evalunitres2.setQtyrange6(Integer.parseInt(evalunitsResourceActualizarDto.getRange06()));
							evalunitres2.setQtyrange7(Integer.parseInt(evalunitsResourceActualizarDto.getRange07()));
							evalunitres2.setQtyrange8(Integer.parseInt(evalunitsResourceActualizarDto.getRange08()));
							evalunitres2.setQtyrange9(Integer.parseInt(evalunitsResourceActualizarDto.getRange09()));
							evalunitres2.setQtyrange10(Integer.parseInt(evalunitsResourceActualizarDto.getRange10()));
							evalunitres2.setQtyrange11(Integer.parseInt(evalunitsResourceActualizarDto.getRange11()));
							evalunitres2.setCreatedat(fechaDate2);
							evalunitres2.setModifiedat(fechaDate2);
							
							evalunitres3 = evalunitresRepository.save(evalunitres2);

							// Auditoría
							module = "Evaluación de Unidades de Recursos";
							Descmodule = "Se agregó la Evaluación de Unidades de Recurso: " + evalunitres3.getId();
							auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());
							String singo1 = "(";
							String singo2 = ")";
							String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1)
									.concat(encontreSessionUsuario.get().getEmail().concat(singo2));
							auditDto.setUserref(usryemail);
							auditDto.setModule(module);
							auditDto.setDesc(Descmodule);
							auditDto.setCreatedat(fechaDate2);
							usersService.registrarAuditSesion(auditDto);

							RespuestaValueDto respuestaValueDto = new RespuestaValueDto(evalunitres3.getId());
							URI location = URI
									.create("/evalunits/" + evalunitid + "/resources/" + evalunitres3.getId()); 

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

						} catch (Exception e) {
							respuesta.setMsg("Error interno del servidor " + e.getMessage());
							estatus = HttpStatus.INTERNAL_SERVER_ERROR;
						} finally {
							if (entityManager != null && entityManager.isOpen()) {
								entityManager.close();
							}
						}
					}

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

	@DeleteMapping({ "/evalunits/{evalunitid}/resources/{evalunitresid}" })
	public ResponseEntity<?> deleteEvalunitsRecursos(HttpServletRequest request,
			@PathVariable("evalunitid") final Integer evalunitid,
			@PathVariable(name = "evalunitresid", required = false) final Integer evalunitresid) 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);

		AuditRequestDto auditDto = new AuditRequestDto();
		String module = "";
		String Descmodule = "";

		Date fecha3 = new Date();
		SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata2 = formatter.format(fecha3);
		Date fechaDate2 = formatter.parse(dataFormattata2);

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

		// Verifico la session
		if (sessionid == null) {
			respuesta.setMsg("Llamada al servicio malformado");
			estatus = HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		} 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); // 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);
				}

				int rolisvalid = 0;
				try {

					// verifico si tiene el privilegio
					rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(),
							213);
					if (rolisvalid == 0) {
						respuesta.setMsg("No tiene los Privilegios");
						estatus = HttpStatus.FORBIDDEN;
						return new ResponseEntity(respuesta, estatus);
					}

					Optional<Evalunits> obtunits = evalunitsRepository.findById(evalunitid);
					Evalunitres evalunitres = new Evalunitres();
					// Verifico si encontre la evaluaciòn de unidad
					if (!obtunits.isPresent()) {
						respuesta.setMsg("Registro no encontrado");
						return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
					}

					// Verifico si existe el id de unidades de recursos
					Optional<Evalunitres> obtRecursos = evalunitresRepository.findById(evalunitresid);
					Evalunitres recurso1 = new Evalunitres();
					Evalunitres recurso2 = new Evalunitres();

					// Verifico si encontre el requisito externos
					if (obtRecursos.isPresent()) {
						recurso1 = obtRecursos.get();
					} else {
						respuesta.setMsg("Registro no encontrado");
						return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
					}

					try {

						evalunitresRepository.delete(recurso1);

						module = "Evaluación de Unidades de Recursos";
						Descmodule = "Se borró de la Evaluación de Unidades " + evalunitid + " de Recursos: "
								+ recurso1.getId();
						auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());
						String singo1 = "(";
						String singo2 = ")";
						String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1)
								.concat(encontreSessionUsuario.get().getEmail().concat(singo2));
						auditDto.setUserref(usryemail);
						auditDto.setModule(module);
						auditDto.setDesc(Descmodule);
						auditDto.setCreatedat(fechaDate2);
						usersService.registrarAuditSesion(auditDto);

						RespuestaValueDto respuestaValueDto = new RespuestaValueDto(evalunitresid);
						URI location = URI.create("/evalunits/" + evalunitid + "/resources/" + evalunitresid); 
						
						return ResponseEntity.created(location).body(respuestaValueDto);
					} catch (Exception e) {
						respuesta.setMsg("No se pudo borrar por alguna razón");
						estatus = HttpStatus.CONFLICT;
						return new ResponseEntity(respuesta, estatus);
					} finally {
						if (entityManager != null && entityManager.isOpen()) {
							entityManager.close();
						}
					}
				} catch (Exception e) {
					respuesta.setMsg("Error interno. Descripción del error " + e.getMessage());
					estatus = HttpStatus.INTERNAL_SERVER_ERROR;
					return new ResponseEntity(respuesta, estatus);
				} finally {
					if (entityManager != null && entityManager.isOpen()) {
						entityManager.close();
					}
				}
			}
			return new ResponseEntity(respuesta, HttpStatus.OK);
		}
	}
	
	public static boolean esNumeroEntero(double numero) {
        if (Double.isInfinite(numero) || Double.isNaN(numero)) {
            return false;
        }
        
        return numero == Math.floor(numero);
    }

}
