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.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.dacrt.SBIABackend.dto.EntryImpactDto;
import com.dacrt.SBIABackend.dto.EvalProcessRecordsDto;
import com.dacrt.SBIABackend.dto.EvalProcessRequestDto;
import com.dacrt.SBIABackend.dto.EvalProcessResponseDto;
import com.dacrt.SBIABackend.dto.EvalprocimpactsActualizarDto;
import com.dacrt.SBIABackend.dto.ImpactResponseDto;
import com.dacrt.SBIABackend.dto.PeriodParResponseDto;
import com.dacrt.SBIABackend.dto.PeriodsResponseDto;
import com.dacrt.SBIABackend.dto.ProcessActualizarDto;
import com.dacrt.SBIABackend.dto.ProcessResponDto;
import com.dacrt.SBIABackend.dto.ProcessTypeDto;
import com.dacrt.SBIABackend.dto.RtoResponseDto;
import com.dacrt.SBIABackend.dto.ScaleResponseDto;
import com.dacrt.SBIABackend.dto.StatusDto;
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.Processes;
import com.dacrt.SBIABackend.repository.CampaignsRepository;
import com.dacrt.SBIABackend.repository.EvalprocessesRepository;
import com.dacrt.SBIABackend.repository.EvalprocimpactsRepository;
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 EvalprocimpactsController {
	@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
	EvalprocimpactsRepository evalprocimpactsRepository;
	
	@Autowired
	EvalprocessesRepository evalprocessesRepository;
	
	Logger logger = LoggerFactory.getLogger(EvalprocimpactsController.class);
	
	@GetMapping({ "/evalprocesses/{evalprocessid}/impact", "/evalprocesses/{evalprocessid}/impact/{evalprocimpactid}" })
	public ResponseEntity<EntryImpactDto> ObtenerImpact(HttpServletRequest request,
			@PathVariable("evalprocessid") final Integer evalprocessid,
			@PathVariable(name = "evalprocimpactid", required = false) final Integer evalprocimpactid) 
					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 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);
		
		// 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);
				}

				// Verifico si existe el id de la Evaluaciòn del proceso
				Optional<Evalprocesses> obtproceso = evalprocessesRepository.findById(evalprocessid);
				Evalprocimpacts evalprocimpacts = new Evalprocimpacts();
				// Verifico si encontre el proceso
			    if (!obtproceso.isPresent()) {
			    	respuesta.setMsg("Registro no encontrado");
					return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
			    }
			    
				try {
					Query query;
					Query query2;
					Query query3;
					String QueryTotal = "";
					// Luego consulto la tabla EvalProcess
					String SentenciaBase = "SELECT  ei.id, " + "                     ep.impactst, "
							+ "                     CASE WHEN ep.impactst = 0 THEN 'Abierta' ELSE 'Completada' END AS descStatus,"
							+ "						ei.rtoqty," + "                     ei.evalprocrtoperiodpar, "
							+ "						( SELECT elemento ->> 'dsc' AS descr "
							+ "        					FROM main.params p, "
							+ "                              jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
							+ "                       WHERE p.paramname = 'EVALPROC_PERIOD' "
							+ "                         AND ei.evalprocrtoperiodpar = elemento ->> 'value') periodpar, "
							+ "						ei.rtolegalpar, " + "						ei.rtofinantialpar, "
							+ "						ei.rtooperativepar, "
							+ "						ei.rtoreputationalpar, "
							+ "						ei.rtocustomerpar, " + "						ei.notes, "
							+ "						( SELECT elemento ->> 'filter' AS filter "
							+ "        					FROM main.params p, "
							+ "                              jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
							+ "                       WHERE p.paramname = 'EVALPROC_PERIOD' "
							+ "                         AND ei.evalprocrtoperiodpar = elemento ->> 'value') filterpar "
							+ "   			FROM  main.evalprocimpacts ei, "
							+ "                   main.evalprocesses ep "
							+ "             WHERE ei.evalprocessid = ep.id "
							+ "               AND ei.evalprocessid = :evalprocessid ";
					
					if (evalprocimpactid != null) {
						QueryTotal = SentenciaBase + " AND ei.id= :evalprocimpactid ";
					} else {
						QueryTotal = SentenciaBase;
					}
					
					System.out.println(QueryTotal);
					query = entityManager.createNativeQuery(QueryTotal);
					query.setParameter("evalprocessid", evalprocessid);
					if (evalprocimpactid != null) {
						query.setParameter("evalprocimpactid", evalprocimpactid);
					}
					cuantosregistro = (long) query.getResultList().size();
					query.setFirstResult(offsetIn);
					query.setMaxResults(numofrecordsIn);
					List<Object[]> resultados = query.getResultList();
					
					String QueryPeriod = "SELECT CAST(elem AS TEXT) " + "	FROM main.params pa, "
							+ "	jsonb_array_elements(CAST(pa.value AS jsonb)) AS elem "
							+ "	WHERE pa.paramname = 'EVALPROC_PERIOD' ";

					String QueryScale = "SELECT CAST(elem AS TEXT) " + "	FROM main.params pa, "
							+ "	jsonb_array_elements(CAST(pa.value AS jsonb)) AS elem "
							+ "	WHERE pa.paramname = 'EVALPROC_SCALEIMPACT' ";
					
					EntryImpactDto entryImpactDto = new EntryImpactDto();
					ImpactResponseDto impactResponseDto = new ImpactResponseDto();
					StatusDto status = new StatusDto();
					RtoResponseDto rtoResponseDto = new RtoResponseDto();
					List<StatusDto> statusDtoList = new ArrayList();
					List<RtoResponseDto> rtoResponseDtoList = new ArrayList();
					PeriodParResponseDto periodParResponseDto = new PeriodParResponseDto();
					ScaleResponseDto scaleResponseDto = new ScaleResponseDto();
					PeriodsResponseDto periodsResponseDto = new PeriodsResponseDto();
					List<ScaleResponseDto> scaleResponseDtoList = new ArrayList();
					List<PeriodsResponseDto> periodsResponseDtoList = new ArrayList();
					
					query2 = entityManager.createNativeQuery(QueryPeriod);
					List<Object[]> resultadosPeriod = query2.getResultList();
					
					JSONObject jsonObject;
					String jsonStringPeriod = "";
					if (resultadosPeriod.size() > 0) {
						for (Object period : resultadosPeriod) {
							jsonStringPeriod = (String) period; // Recupera el JSON como String
							jsonObject = new JSONObject(jsonStringPeriod); // Convierte String a JSONObject
							// Extrae los valores del JSONObject
							String dsc = jsonObject.getString("dsc");
							String value = jsonObject.getString("value");

							periodsResponseDto.setDsc(dsc);
							periodsResponseDto.setValue(value);
							periodsResponseDtoList.add(periodsResponseDto);
							periodsResponseDto = new PeriodsResponseDto();
						}
					}
					
					query3 = entityManager.createNativeQuery(QueryScale);
					List<Object[]> resultadosScale = query3.getResultList();
					
					String jsonStringScale = "";
					if (resultadosScale.size() > 0) {
						for (Object scale : resultadosScale) {
							jsonStringScale = (String) scale; // Recupera el JSON como String
							jsonObject = new JSONObject(jsonStringScale); // Convierte String a JSONObject
							// Extrae los valores del JSONObject
							String dsc = jsonObject.getString("dsc");
							String value = jsonObject.getString("value");

							scaleResponseDto.setDsc(dsc);
							scaleResponseDto.setValue(value);
							scaleResponseDtoList.add(scaleResponseDto);
							scaleResponseDto = new ScaleResponseDto();
						}
					}
					
					Integer filter = 0;
					Integer periodo = 0;
					if (cuantosregistro > 0) {
						for (Object[] fila : resultados) {
							impactResponseDto.setId((Integer) fila[0]);
							status.setId((Integer) fila[1]);
							status.setName((String) fila[2]);
							impactResponseDto.setStatus(status);
							filter = Integer.parseInt((String) fila[12]);
							rtoResponseDto.setQty(String.valueOf((Integer) fila[3] / filter));
							
							periodParResponseDto.setId((String) fila[4]);
							periodParResponseDto.setName((String) fila[5]);
							
							rtoResponseDto.setPeriodpar(periodParResponseDto);
							rtoResponseDto.setLegal((String) fila[6]);
							rtoResponseDto.setFinantial((String) fila[7]);
							rtoResponseDto.setOperative((String) fila[8]);
							rtoResponseDto.setReputational((String) fila[9]);
							rtoResponseDto.setCustomer((String) fila[10]);
							rtoResponseDto.setNotes((String) fila[11]);
							impactResponseDto.setRto(rtoResponseDto);
							impactResponseDto.setScale(scaleResponseDtoList);
							impactResponseDto.setPeriods(periodsResponseDtoList);
							
							rtoResponseDto = new RtoResponseDto();
						}
					
						entryImpactDto.setEntry(impactResponseDto);
						entryImpactDto.setSessionvalidthru(fechaComoCadena);
						
					} else {
						impactResponseDto.setId(0);
						status.setId(0);
						status.setName("Abierta");
						impactResponseDto.setStatus(status);
						rtoResponseDto.setQty("");
						periodParResponseDto.setId("1");
						periodParResponseDto.setName("Horas");
						rtoResponseDto.setPeriodpar(periodParResponseDto);
						rtoResponseDto.setLegal("");
						rtoResponseDto.setFinantial("");
						rtoResponseDto.setOperative("");
						rtoResponseDto.setReputational("");
						rtoResponseDto.setCustomer("");
						rtoResponseDto.setNotes("");
						impactResponseDto.setRto(rtoResponseDto);
						impactResponseDto.setPeriods(periodsResponseDtoList);
						impactResponseDto.setScale(scaleResponseDtoList);
						impactResponseDto.setPeriods(periodsResponseDtoList);
						
						entryImpactDto.setEntry(impactResponseDto);
						entryImpactDto.setSessionvalidthru(fechaComoCadena);
					}
						
						return new ResponseEntity(entryImpactDto, 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({ "/evalprocesses/{evalprocessid}/impact",
			"/evalprocesses/{evalprocessid}/impact/{evalprocimpactid}" })
	public ResponseEntity<?> actualizarImpact(HttpServletRequest request,
			@RequestBody EvalprocimpactsActualizarDto evalprocimpactsActualizarDto,
			@PathVariable("evalprocessid") final Integer evalprocessid,
			@PathVariable(name = "evalprocimpactid", required = false) final Integer evalprocimpactid) 
					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);
				}

				if (evalprocimpactsActualizarDto.getEvalprocrtoperiodpar() == null
						|| evalprocimpactsActualizarDto.getRtocustomerpar() == ""
						|| evalprocimpactsActualizarDto.getRtofinantialpar() == ""
						|| evalprocimpactsActualizarDto.getRtolegalpar() == ""
						|| evalprocimpactsActualizarDto.getRtooperativepar() == ""
						|| evalprocimpactsActualizarDto.getRtoreputationalpar() == ""
						|| evalprocimpactsActualizarDto.getRtoqty() == null) {
					respuesta.setMsg("Llamada al servicio malformado");
					estatus = HttpStatus.BAD_REQUEST;
					return new ResponseEntity(respuesta, estatus);
				}
				// Verifico si existe el id de la Evaluaciòn del proceso
				Optional<Evalprocesses> obtproceso = evalprocessesRepository.findById(evalprocessid);
				Evalprocimpacts evalprocimpacts = new Evalprocimpacts();
				// Verifico si encontre el proceso
			    if (!obtproceso.isPresent()) {
			    	respuesta.setMsg("Registro no encontrado");
					return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
			    }
				String module, Descmodule = "";
				String period = evalprocimpactsActualizarDto.getEvalprocrtoperiodpar().toString();
			    Query query;
			    
				try {
			    String QueryPeriod = "SELECT elemento ->> 'filter' AS filter,elemento ->> 'value' AS valor " 
							+ "	FROM main.params pa, " + "	jsonb_array_elements(CAST(pa.value AS jsonb)) AS elemento "
							+ "	WHERE pa.paramname = 'EVALPROC_PERIOD' " + " AND elemento ->> 'value' = :period ";
			    query = entityManager.createNativeQuery(QueryPeriod);
			    query.setParameter("period", period);
				List<Object[]> resultadosPeriod = query.getResultList();
					cuantosregistro = query.getResultList().size();
					Integer filter = 0;
				if (cuantosregistro > 0) {
					for (Object[] fila : resultadosPeriod) {
							filter = Integer.parseInt((String) fila[0]);
					}
				}
				
					if (evalprocimpactid != 0) {// actualizar impacto
					try {
							// verifico si tiene el privilegio
							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); 
						}	
							 
							// Verifico si existe el id de la Evaluaciòn del proceso
							Optional<Evalprocimpacts> obtImpacto = evalprocimpactsRepository
									.findByEvalprocessidImpactsid(evalprocessid, evalprocimpactid);
							Evalprocimpacts evalprocimpacts2 = new Evalprocimpacts();
							Evalprocimpacts evalprocimpacts3 = new Evalprocimpacts();
							Evalprocesses evalprocesses = new Evalprocesses();
							// Verifico si encontre el proceso
					    if (!obtImpacto.isPresent()) {
					    	respuesta.setMsg("Registro no encontrado");
							return new ResponseEntity(respuesta, HttpStatus.NOT_FOUND);
					    }
					    
							Optional<Evalprocesses> obtproceso2 = evalprocessesRepository.findById(evalprocessid);
							evalprocesses = obtproceso2.get();
							// Vamos actualizar
							evalprocimpacts2 = obtImpacto.get();
					    evalprocimpacts2.setNotes(evalprocimpactsActualizarDto.getNotes());
							evalprocimpacts2
									.setEvalprocrtoperiodpar(evalprocimpactsActualizarDto.getEvalprocrtoperiodpar());
					    evalprocimpacts2.setRtolegalpar(evalprocimpactsActualizarDto.getRtolegalpar());
					    evalprocimpacts2.setRtofinantialpar(evalprocimpactsActualizarDto.getRtofinantialpar());
					    evalprocimpacts2.setRtooperativepar(evalprocimpactsActualizarDto.getRtooperativepar());
					    evalprocimpacts2.setRtocustomerpar(evalprocimpactsActualizarDto.getRtocustomerpar());
							evalprocimpacts2
									.setRtoreputationalpar(evalprocimpactsActualizarDto.getRtoreputationalpar());
							evalprocimpacts2.setRtoqty(evalprocimpactsActualizarDto.getRtoqty() * filter);
					    evalprocimpacts2.setModifiedat(fechaDate2);
							evalprocimpacts3 = evalprocimpactsRepository.save(evalprocimpacts2);
							// Auditoría
					     module = "Evaluación de Procesos de Impacto";
							Descmodule = "Se actualizó la Evaluación de Procesos de Impacto: "
									+ evalprocimpacts3.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(evalprocimpacts3.getId()); 
							URI location = URI
									.create("/evalprocesses/" + evalprocessid + "/impact/" + evalprocimpacts3.getId()); // O
																														// la
																														// URL
																														// correcta
																														// para
																														// //
																														// tu
																														// recurso
						 
						 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(), 202);
						if (rolisvalid == 0) {
							respuesta.setMsg("No tiene los Privilegios"); 
							estatus = HttpStatus.FORBIDDEN;
							return new ResponseEntity(respuesta, estatus); 
						}	
						
							Optional<Evalprocimpacts> evalprocimpacts4 = evalprocimpactsRepository
									.findByEvalprocessid(evalprocessid);
							 
						if (evalprocimpacts4.isPresent()) {
							respuesta.setMsg("Ya existe una Evaluación de Proceso de Impacto"); 
							estatus = HttpStatus.FORBIDDEN;
							return new ResponseEntity(respuesta, estatus); 
						}
						
							Evalprocimpacts evalprocimpacts2 = new Evalprocimpacts();
							Evalprocimpacts evalprocimpacts3 = new Evalprocimpacts();
							Evalprocesses evalprocesses = new Evalprocesses();
							Optional<Evalprocesses> obtproceso2 = evalprocessesRepository.findById(evalprocessid);
							evalprocesses = obtproceso2.get();
					    
					    evalprocimpacts2.setNotes(evalprocimpactsActualizarDto.getNotes());
					    evalprocimpacts2.setEvalprocessid(evalprocesses);
							evalprocimpacts2
									.setEvalprocrtoperiodpar(evalprocimpactsActualizarDto.getEvalprocrtoperiodpar());
					    evalprocimpacts2.setRtolegalpar(evalprocimpactsActualizarDto.getRtolegalpar());
					    evalprocimpacts2.setRtofinantialpar(evalprocimpactsActualizarDto.getRtofinantialpar());
					    evalprocimpacts2.setRtooperativepar(evalprocimpactsActualizarDto.getRtooperativepar());
					    evalprocimpacts2.setRtocustomerpar(evalprocimpactsActualizarDto.getRtocustomerpar());
							evalprocimpacts2
									.setRtoreputationalpar(evalprocimpactsActualizarDto.getRtoreputationalpar());
							evalprocimpacts2.setRtoqty(evalprocimpactsActualizarDto.getRtoqty() * filter);
					    evalprocimpacts2.setCreatedat(fechaDate2);
					    evalprocimpacts2.setModifiedat(fechaDate2);
							evalprocimpacts3 = evalprocimpactsRepository.save(evalprocimpacts2);
					    
							// Auditoría
					    module = "Evaluación de Procesos de Impacto";
					    Descmodule = "Se agregó la Evaluación de Procesos de Impacto: " + evalprocimpacts3.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(evalprocimpacts3.getId()); 
							URI location = URI
									.create("/evalprocesses/" + evalprocessid + "/impact/" + evalprocimpacts3.getId()); // O
																														// la
																														// URL
																														// correcta
																														// para
																														// //
																														// tu
																														// recurso
						 
						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);
		}
	}
}