package com.dacrt.SBIABackend.controler;

import java.math.BigInteger;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.Normalizer;
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.regex.Pattern;

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

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.FacilityDto;
import com.dacrt.SBIABackend.dto.StatusDto;
import com.dacrt.SBIABackend.dto.StrategiesDependencyDetDto;
import com.dacrt.SBIABackend.dto.StrategiesDetRecordDto;
import com.dacrt.SBIABackend.dto.StrategiesRecordDto;
import com.dacrt.SBIABackend.dto.StrategyDetDto;
import com.dacrt.SBIABackend.dto.TypeStrategiDetDto;
import com.dacrt.SBIABackend.dto.TypeUnitDto;
import com.dacrt.SBIABackend.dto.TypesUnitDto;
import com.dacrt.SBIABackend.dto.UnitsDto;
import com.dacrt.SBIABackend.dto.UnitsUsersDto;
import com.dacrt.SBIABackend.dto.UnitsUsersDto2;
import com.dacrt.SBIABackend.dto.UnitsUsersDto3;
import com.dacrt.SBIABackend.dto.UnitsUsersDto4;
import com.dacrt.SBIABackend.dto.VicepresidencyDto;
import com.dacrt.SBIABackend.dto.requestDto.StrategiesRequestDto;
import com.dacrt.SBIABackend.dto.requestDto.UnitsRequestNewDto;
import com.dacrt.SBIABackend.dto.responseDto.CampainsResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.EstrategiesDetailResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.StrategiesDetRespondeDto;
import com.dacrt.SBIABackend.dto.responseDto.UnitsResponseDto;
import com.dacrt.SBIABackend.entity.Facilities;
import com.dacrt.SBIABackend.entity.Strategies;
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.Vicepresidencies;
import com.dacrt.SBIABackend.entity.Workers;
import com.dacrt.SBIABackend.repository.CoverageprocessesRepository;
import com.dacrt.SBIABackend.repository.CoverageprocesseshistoryRepository;
import com.dacrt.SBIABackend.repository.ProcessesRepository;
import com.dacrt.SBIABackend.repository.StrategiesRepository;
import com.dacrt.SBIABackend.repository.StrategiesdetRepository;
import com.dacrt.SBIABackend.repository.StrategiesdetprocessesRepository;
import com.dacrt.SBIABackend.repository.StrategiesdetunitsRepository;
import com.dacrt.SBIABackend.repository.UnitprocessesRepository;
import com.dacrt.SBIABackend.repository.UnitsRepository;
import com.dacrt.SBIABackend.repository.UserunitsRepository;
import com.dacrt.SBIABackend.repository.VicepresidenciesRepository;
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.RoleDto;
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.service.FacilitiesService;
import com.dacrt.SBIABackend.service.UnitsService;
import com.dacrt.SBIABackend.service.VicepresidenciesService;
import com.dacrt.SBIABackend.utils.HttpReqRespUtils;


@RestController
//@RequestMapping("/units")   
@CrossOrigin(origins = "*")
public class StrategiesdetController {
	
	@Autowired
	private ParamsRepository paramsRepository;
	
	@Autowired
	private UsersRepository usersRepository;
	
	@Autowired
	private AuditRepository auditRepository;
	
	@Autowired
	private StrategiesRepository strategiesRepository;
	
	@Autowired
	private StrategiesdetRepository strategiesdetRepository;
	
	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;
	
	@Autowired
	private UnitprocessesRepository unitprocessesRepository;
	
	@Autowired
	private VicepresidenciesRepository vicepresidenciesRepository;
	
	@Autowired
	UsersService usersService;
	
	@Autowired
	SecurityService securityService;
	
	@Autowired
	ParamsService paramsService;
	
	@Autowired
	MenuService menuService;
	
	@Autowired
	MenuService campaignsService;
	
	@Autowired
	UserunitsRepository userunitsRepository; 
	
	@Autowired
	StrategiesdetunitsRepository strategiesdetunitsRepository;
	
	@Autowired
	StrategiesdetprocessesRepository strategiesdetprocessesRepository;
	
	@Autowired
	VicepresidenciesService vicepresidenciesService;
	
	@Autowired
	FacilitiesService facilitiesService;
	
	@Autowired
	UnitsRepository unitsRepository;
	
	@Autowired
	ProcessesRepository processesRepository;
	
	@Autowired
	CoverageprocesseshistoryRepository coverageprocesseshistoryRepository;
	
	@Autowired
	CoverageprocessesRepository coverageprocessesRepository;
	
	@Autowired
	UnitsService unitsService; 
	
	@Autowired
    private JdbcTemplate jdbcTemplate;
	
	@PersistenceContext
    private EntityManager entityManager;
	
	@Value("${spring.datasource.url}")
	private String conexion;
	
	@Value("${spring.datasource.username}")
	private String userbd;
	
	@Value("${spring.datasource.password}")
	private String passbd;


	@GetMapping("/strategiesdet/{strategydetid}")
	public ResponseEntity<?> getOnestrategiesdet(HttpServletRequest request, @PathVariable("strategydetid") final Integer strategydetid)
			throws ParseException {
				RespuestaDto respuesta = new RespuestaDto("", false);
				HttpStatus estatus = HttpStatus.FORBIDDEN;
				StrategiesDetRespondeDto strategyResponseDto = new StrategiesDetRespondeDto();
				EstrategiesDetailResponseDto strategyDetailsResponseDto = new EstrategiesDetailResponseDto();
				//StrategiesRecordDto
			//	ParamsDto detalleParams;
				UnitsUsersDto detalleUnits;
				UnitsUsersDto detalleProce;
				UnitsUsersDto2 detalleUnits2;
				UnitsUsersDto4 detalleProce2;
				StatusDto detalleStatus;
				TypeUnitDto detalleType;
				TypesUnitDto detalleTypes;
				TypesUnitDto detalleTypesD;
				StrategiesRecordDto detalleRecord=null;
				StrategyDetDto detalleStrategy;
				FacilityDto detalleFacility;
				TypeStrategiDetDto detalleTypeStrategy;
				StrategiesDependencyDetDto detalleTipoDependencia;
				PrivilegesAllDto detallePrivilege;
			     List<UnitsUsersDto2> listasUnits = new ArrayList<>();
			     List<StrategiesRecordDto> listasRecord= new ArrayList<>();
			     List<UnitsUsersDto4> listasProcess = new ArrayList<>();
			     List<TypesUnitDto> listasTypes = new ArrayList<>();
			     List<TypesUnitDto> listasTypesD = 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;
			        String isSupplier="";
			        String isWorker="";
			       
			        int idrol,searchIdStrategyGeneral,searchUnitid;
			   	   String searchIn = "";
			   	   String searchListUnit = "";
			       String contentIn = "";
			       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();
						   
						    try { 
							  Workers valorworker =  encontreSessionUsuario.get().getWorkerid();
							  
							     idworker = valorworker.getId();
							 /// String isSupplier="";
						         isWorker="SI";
							  
						     }
						      catch (Exception e) {
							   isWorker="NO";
						     }
						   
						     try { 
								  Suppliers valorsuppliers =  encontreSessionUsuario.get().getSupplierid();
								  
								   idsupplier = valorsuppliers.getId();
								 /// String isSupplier="";
								    isSupplier="SI";
								  
							   }
							   catch (Exception e) {
								    isSupplier="NO";
							   }						
						   
						   if (encontreSessionUsuario.isPresent()) {
							   Date FechaReg = encontreSessionUsuario.get().getValidthru(); 

							   //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);
									//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, 310);
							   //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);
									
							   }
							   
							
								//  if (contentIn !=null) {
								 // menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());
								  //}
								  							
							
						 } 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);
						 }
					}
					
					//String Cadena = "elemento ->>";
												
				try {								

					
				
				
					String SentenciaBase = "  SELECT ed.id,  ed.status, e.id AS idgeneral,  e.name AS estrageneral,   "
							+ "							     (   "
							+ "							         SELECT STRING_AGG(CAST(u.id AS TEXT), ',')   "
							+ "							         FROM main.strategiesdetunits eu   "
							+ "							         JOIN main.units u ON u.id = eu.unitid   "
							+ "							         WHERE eu.strategydetid = ed.id   "
							+ "							     ) AS idunits,   "
							+ "							     (   "
							+ "							         SELECT STRING_AGG(u.name, ',')   "
							+ "							         FROM main.strategiesdetunits eu   "
							+ "							         JOIN main.units u ON u.id = eu.unitid   "
							+ "							         WHERE eu.strategydetid = ed.id   "
							+ "							     ) AS nameunits,   "
							+ "							     (   "
							+ "							         SELECT STRING_AGG(CAST(up1.processid AS TEXT), ',')   "
							+ "							         FROM main.strategiesdetprocesses sp   "
							+ "							         JOIN main.unitprocesses up1 ON sp.unitprocessid = up1.id   "
							+ "							         WHERE sp.strategyid = ed.id   "
							+ "							     ) AS idproccess,   "
							+ "							     (   "
							+ "							         SELECT STRING_AGG(p.name, ',')   "
							+ "							         FROM main.strategiesdetprocesses sp   "
							+ "							         JOIN main.unitprocesses up2 ON sp.unitprocessid = up2.id "
							+ "	                                 JOIN main.processes p ON up2.processid = p.id "
							+ "							         WHERE sp.strategyid = ed.id   "
							+ "							     ) AS nameprocces,   "
							+ "	                            pr.descr AS desctipo,  pr.valor AS valortipo, pr2.descr AS descdepen,   "
							+ "							     pr2.valor AS valordepen,coalesce(su.id, 0) AS idsupli,coalesce(su.name, '') AS namesupli,coalesce(ap.id, 0) AS idappli,   "
							+ "							     coalesce(ap.name, '') AS nameappli,coalesce(re.id, 0) AS idresor,coalesce(re.name, '') AS nameresor,coalesce(fa.id, 0) AS idfac,   "
							+ "							     coalesce(fa.name, '') AS namefa,coalesce(po.id, 0) AS idposi,coalesce(po.name, '') AS nameposi,e.dsc,ed.dsc AS desdetallada,   "
							+ "							     coalesce(ch.id, 0) AS idchannel,coalesce(ch.name, '') AS namechannel,ed.name AS estdet,   "
							+ "							     (   "
							+ "							         SELECT STRING_AGG(CAST(u.status AS TEXT), ',')   "
							+ "							         FROM main.strategiesdetunits eu   "
							+ "							         JOIN main.units u ON u.id = eu.unitid   "
							+ "							         WHERE eu.strategydetid = ed.id   "
							+ "							     ) AS statusunits,   "
							+ "							 	 (   "
							+ "							         SELECT STRING_AGG(CAST(p.status AS TEXT), ',')   "
							+ "							         FROM main.strategiesdetprocesses sp   "
							+ "							         JOIN main.unitprocesses up3 ON sp.unitprocessid = up3.id "
							+ "	                                 JOIN main.processes p ON up3.processid = p.id "
							+ "							         WHERE sp.strategyid = ed.id   "
							+ "							     ) AS statusprocces,   "
							+ "							    (   "
							+ "							         SELECT STRING_AGG(COALESCE(CAST(up.deleted AS TEXT), 'v'), ',')   "
							+ "							         FROM main.strategiesdetprocesses sp   "
							+ "							         JOIN main.unitprocesses up ON sp.unitprocessid = up.id   "
							+ "							         WHERE sp.strategyid = ed.id   "
							+ "							     ) AS deleterela,  "
							+ "							   (         "
							+ "							 		 SELECT STRING_AGG(COALESCE(CAST(sp.unitprocessid AS TEXT), '0'), ',')     "
							+ "							 		 FROM main.strategiesdetprocesses sp     "
							+ "							 	     JOIN main.unitprocesses up ON sp.unitprocessid = up.id     "
							+ "							 		 WHERE sp.strategyid = ed.id     "
							+ "							 	) AS idrelacion   "
							+ "							  FROM  main.strategiesdet ed   "
							+ "							  LEFT JOIN  main.strategies e ON e.id = ed.strategyid   "
							+ "							  LEFT JOIN   "
							+ "							     (   "
							+ "							         SELECT elemento ->> 'dsc' AS descr, elemento ->> 'value' AS valor   "
							+ "							         FROM main.params p, jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento   "
							+ "							         WHERE p.paramname = 'STRATEGY_TYPE'   "
							+ "							     ) pr ON e.strategytypepar = CAST(pr.valor AS integer)   "
							+ "							  LEFT JOIN   "
							+ "							     (   "
							+ "							         SELECT elemento ->> 'dsc' AS descr, elemento ->> 'value' AS valor   "
							+ "							         FROM main.params p, jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento   "
							+ "							         WHERE p.paramname = 'STRATEGY_DEPENDENCY'   "
							+ "							     ) pr2 ON e.strategydependencypar = CAST(pr2.valor AS integer)   "
							+ "							  LEFT JOIN main.suppliers su ON ed.supplierid = su.id   "
							+ "							  LEFT JOIN main.applications ap ON ed.applicationid = ap.id   "
							+ "							  LEFT JOIN main.resources re ON ed.resourceid = re.id   "
							+ "							  LEFT JOIN main.facilities fa ON ed.facilityid = fa.id   "
							+ "							  LEFT JOIN main.positions po ON ed.positionid = po.id   "
							+ "							  LEFT JOIN main.channels ch ON ed.channelid = ch.id" ;
					
									
					 String QueryTotal = "";
					 QueryTotal = SentenciaBase + " WHERE ed.id = " + strategydetid;
 					 String groupby = " GROUP BY ed.id,ed.status,e.id,e.name,pr.descr,pr.valor,pr2.descr,pr2.valor,su.id,su.name,ap.id,ap.name,re.id,re.name,fa.id,fa.name,po.id,po.name,ch.id,ch.name ";
					 QueryTotal = QueryTotal + groupby;
					 	 
					 Query query = entityManager.createNativeQuery(QueryTotal);
					
					       
					       query = entityManager.createNativeQuery(QueryTotal);
					       //query.setFirstResult(offsetIn);
						   //query.setMaxResults(numofrecordsIn);
						   List<Object[]> listacompleta = query.getResultList();
					    
				    		   for (Object[] reg : listacompleta) {
				    		 
				    		   detalleStatus = new StatusDto();
				    		   detalleType = new TypeUnitDto();
				    		   detalleRecord = new StrategiesRecordDto();
				    		   detalleFacility = new FacilityDto();
				    		   detalleTypeStrategy = new  TypeStrategiDetDto();
				    		   detalleStrategy = new  StrategyDetDto();
				    		   detalleTipoDependencia = new  StrategiesDependencyDetDto();
				    		   
				    		   detalleRecord.setId((int) reg[0]);
				    		   detalleRecord.setDsc((String) reg[23]);
				    		   detalleRecord.setName((String) reg[26]);
				    		   detalleStatus.setId((int) reg[1]);
				    		   
				    		   if ((int) reg[1]==1) {
				    			   detalleStatus.setName("Activo");
				    			   
				    		   } else
				    		   {
				    			   detalleStatus.setName("Inactivo");
				    		   }
				    		   
				    		   detalleRecord.setStatus(detalleStatus);
				    		   
				    		  // LLeno primero el type de Estrategia
				    		    
				    		   detalleTypeStrategy.setId((String) reg[9]);
				    		   detalleTypeStrategy.setDsc((String) reg[8]);
				    		   
				    		   // ahora si lleno la estrategia 
				    		   String valorIdEstPadre = (String) reg[2].toString();
				    		   detalleStrategy.setId(valorIdEstPadre);
				    		   detalleStrategy.setName((String) reg[3]);
				    		   detalleStrategy.setDsc((String) reg[22]);
				    		   detalleStrategy.setType(detalleTypeStrategy);
				    		   
				    		   detalleRecord.setStrategy(detalleStrategy);
				    		   
				    		   //vamos a setear las unidades asociadas a la estrategia
				    		   
				    		   String IdUniString = (String) reg[4]; // AQUI VIENEN LOS ID DE LAS UNIDADES
				    		   String NameUniString = (String) reg[5]; // AQUI VIENEN LOS NOMBRES  DE LAS UNIDADES
				    		   String StatusUniString = (String) reg[27]; // AQUI VIENEN LOS status  DE LAS UNIDADES
				    		   
							    if (IdUniString != null && !IdUniString.isEmpty()) {
							    	
							        String[] UniIds = IdUniString.split(",");
							        String[] UniNames = NameUniString.split(",");
							        String[] UniStatus = StatusUniString.split(","); // esto es nuevo
							        int i = 0;
							        listasUnits = new ArrayList<>();
							        for (String uniId : UniIds) {
							        	detalleUnits2 = new UnitsUsersDto2();
							        //	can.add(Integer.parseInt(uniId));
							        	String Nombreuni = UniNames[i];
							        	String StatusUni = UniStatus[i];
							        	detalleUnits2.setId(Integer.parseInt(uniId));
							        	detalleUnits2.setName(Nombreuni);
							        	detalleUnits2.setStatus(Integer.parseInt(StatusUni));
								    	  listasUnits.add(detalleUnits2);
							        	i = i+1;
							        }
							    }  else {
							    	System.out.print(IdUniString);
							    	//detalleUnits = new UnitsUsersDto();
							    	detalleUnits2 = new UnitsUsersDto2();
							    	
							    	//  detalleUnits.setId(0);
							    	 // detalleUnits.setName(null);
							    	  //listasUnits.add(detalleUnits);
							    }		
							    
							    detalleRecord.setUnits(listasUnits);
				    		   /////////////////////////////////////////////////////////
							    
							    /////////////VAMOS A SETEAR LOS PROCESOS ASOCIADOS A LA ESTRATEGIA
							    
							    String IdProString = (String) reg[6]; // AQUI VIENEN LOS ID DE LOS PROCESOS
					    		String NameProString = (String) reg[7]; // AQUI VIENEN LOS NOMBRES  DE LOS PROCESOS
					    		String StatusProString = (String) reg[28]; // AQUI VIENEN LOS STATUS  DE LOS PROCESOS 
					    		String DeleteProString = (String) reg[29]; // AQUI VIENEN LOS delete  DE LOS PROCESOS 
					    		String uniproProString = (String) reg[30]; // AQUI VIENEN LOS delete  DE LOS PROCESOS 
					    		
								    if (IdProString != null && !IdProString.isEmpty()) {
								    	
								        String[] ProIds = IdProString.split(",");
								        String[] ProNames = NameProString.split(",");
								        String[] ProSta = StatusProString.split(",");
								        String[] Prodelete = DeleteProString.split(",");
								        String[] Prounipro = uniproProString.split(",");
								        int i = 0;
								        listasProcess = new ArrayList<>();
								        for (String proId : ProIds) {
								        	detalleProce2 = new UnitsUsersDto4();
								        //	can.add(Integer.parseInt(uniId));
								        	String NombrePro = ProNames[i];
								        	String StatusPro = ProSta[i];
								        	String DeletePro = Prodelete[i];
								        	String UniPropro = Prounipro[i];
								        	detalleProce2.setId(Integer.parseInt(proId));
								        	detalleProce2.setName(NombrePro);
								        	detalleProce2.setStatus(Integer.parseInt(StatusPro));
								        	
								        	if (DeletePro.length()==1) {
								        		 detalleProce2.setDeleted(false);
								        	} else if (DeletePro.length()>1) {
								        		boolean valor = false;
								        		 detalleProce2.setDeleted(true);
								        	} else {
								        		detalleProce2.setDeleted(false);
								        	}
								        	
								        	 if (UniPropro.length()>0) {
								        		 detalleProce2.setUnitprocess(Integer.parseInt(UniPropro));
								        	} else {
								        		detalleProce2.setUnitprocess(0);
								        	}
								        	 
									    	  listasProcess.add(detalleProce2);
								        	i = i+1;
								        }
								    }  else {
								    	System.out.print(IdProString);
								    	//detalleProce = new UnitsUsersDto();
								    	detalleProce2 = new UnitsUsersDto4();
								    	
								    }			
								    detalleRecord.setProcesses(listasProcess);
							    ////////////////////////////////////////////////////////////////////
				    		   /////////DATOS DE LA DEPENDENCIA//////////
								    //  0 es.detalla.id , 1 status, 2 estra general id, 3 name est gral, 4 idunidades, 5 nombreunidades,
									// 6 idprocesos, 7 nombreprocesos, 8 tipo estrategia, 9 valor tipo, 10 des dependencia, 11 valor tipo dependencia,
									// 12 id supli, 13 name suppli, 14 id aplica, 15 name applicati,16 id resour, 17 name resource,18 id facility, 19 name facility,20 id cargo, 21 name cargo
								    
								    if ((int) reg[12]!=0) {
								    	int iddepdencia = (int) reg[12];
								    	detalleTipoDependencia.setDependencyid(iddepdencia);
								    	detalleTipoDependencia.setDependencyname((String) reg[13]);
								    }
                                    if ((int) reg[14]!=0) {
                                    	int iddepdencia = (int) reg[14];
                                    	detalleTipoDependencia.setDependencyid(iddepdencia);
                                    	detalleTipoDependencia.setDependencyname((String) reg[15]);
								    }
                                    if ((int) reg[16]!=0) {
                                    	int iddepdencia = (int) reg[16];
                                    	detalleTipoDependencia.setDependencyid(iddepdencia);
                                    	detalleTipoDependencia.setDependencyname((String) reg[17]);
								    }
                                    if ((int) reg[18]!=0) {
                                    	int iddepdencia = (int) reg[18];
                                    	detalleTipoDependencia.setDependencyid(iddepdencia);
                                    	detalleTipoDependencia.setDependencyname((String) reg[19]);
                                    }
                                    
                                    if ((int) reg[20]!=0) {
                                    	int iddepdencia = (int) reg[20];
                                    	detalleTipoDependencia.setDependencyid(iddepdencia);
                                    	detalleTipoDependencia.setDependencyname((String) reg[21]);
                                    }
                                    
                                    if ((int) reg[24]!=0) {
                                    	int iddepdencia = (int) reg[24];
                                    	detalleTipoDependencia.setDependencyid(iddepdencia);
                                    	detalleTipoDependencia.setDependencyname((String) reg[25]);
                                    }
                                    
								    detalleTipoDependencia.setId((String) reg[11]);
								    detalleTipoDependencia.setDsc((String) reg[10]);
								    
								    
								    detalleRecord.setDependency(detalleTipoDependencia);
								    
							   ////////////////////////	////////////////    
				    	
					    	  
								    listasRecord.add(detalleRecord);
				    	   }
				    	
				    	
				    	
				           //paramsResponseDto.setValidthru(ValidThrufechaSalida);
					     //strategyResponseDto.setRecords(listasRecord);
				  						           
					     strategyDetailsResponseDto.setEntry(detalleRecord);
		                return ResponseEntity.ok(strategyDetailsResponseDto);

				
		       
				} catch (Exception e) {
		            // Manejo de excepciones
					respuesta= new RespuestaDto("Error interno del servidor", false);
					estatus=HttpStatus.INTERNAL_SERVER_ERROR;  
					
		        } finally {
			        if (entityManager != null && entityManager.isOpen()) {
			            entityManager.close();
			        }
			    }
				
				return new ResponseEntity(respuesta, estatus);
			
			}
	
	
	
	@PostMapping("/strategiesdet")
	public ResponseEntity<StrategiesDetRespondeDto> strategiesdet(HttpServletRequest request,@RequestBody UsersListDto tiposfiltros) throws ParseException {
				RespuestaDto respuesta = new RespuestaDto("", false);
				HttpStatus estatus = HttpStatus.FORBIDDEN;
				StrategiesDetRespondeDto strategyResponseDto = new StrategiesDetRespondeDto();
			//	ParamsDto detalleParams;
				UnitsUsersDto detalleUnits;
				UnitsUsersDto2 detalleUnits2;
				UnitsUsersDto detalleProce;
				UnitsUsersDto4 detalleProce2;
				StatusDto detalleStatus;
				TypeUnitDto detalleType;
				TypesUnitDto detalleTypes;
				TypesUnitDto detalleTypesD;
				//StrategiesRecordDto detalleRecord;
				StrategiesDetRecordDto detalleRecord;
				StrategyDetDto detalleStrategy;
				FacilityDto detalleFacility;
				TypeStrategiDetDto detalleTypeStrategy;
				StrategiesDependencyDetDto detalleTipoDependencia;
				PrivilegesAllDto detallePrivilege;
			     List<UnitsUsersDto2> listasUnits = new ArrayList<>();
			     List<StrategiesDetRecordDto> listasRecord= new ArrayList<>();
			     List<UnitsUsersDto4> listasProcess = new ArrayList<>();
			     List<TypesUnitDto> listasTypes = new ArrayList<>();
			     List<TypesUnitDto> listasTypesD = 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;
			        String isSupplier="";
			        String isWorker="";
			       
			        int idrol,searchIdStrategyGeneral,searchUnitid;
			   	   String searchIn = "";
			   	   String searchListUnit = "";
			       String contentIn = "";
			       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;
				 String isSystem="";
				 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();
						   
						    try { 
							  Workers valorworker =  encontreSessionUsuario.get().getWorkerid();
							  
							     idworker = valorworker.getId();
							 /// String isSupplier="";
						         isWorker="SI";
							  
						     }
						      catch (Exception e) {
							   isWorker="NO";
						     }
						   
						     try { 
								  Suppliers valorsuppliers =  encontreSessionUsuario.get().getSupplierid();
								  
								   idsupplier = valorsuppliers.getId();
								 /// String isSupplier="";
								    isSupplier="SI";
								  
							   }
							   catch (Exception e) {
								    isSupplier="NO";
							   }	
						     
						     if (isSupplier=="NO" && isWorker=="NO") {
						    	 
						    	 isSystem ="SI";
						    	 
						     }
						   
						   if (encontreSessionUsuario.isPresent()) {
							   Date FechaReg = encontreSessionUsuario.get().getValidthru(); 

							   //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);
									//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(); //prueba
							   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 310);
							   //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);
									
							   }
							   
								  //searchIn = eliminarAcentos(tiposfiltros.getFilters().getSearch());
							      searchIn = tiposfiltros.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(tiposfiltros.getFilters().getSearch());
								  
								  searchListUnit = tiposfiltros.getFilters().getUnitidlist();
								  searchStatus = tiposfiltros.getFilters().getStatus();	
								  searchIdStrategyGeneral = tiposfiltros.getFilters().getStrategyid();
								  searchUnitid= tiposfiltros.getFilters().getUnitid();
								  searchStrategytype = tiposfiltros.getFilters().getStrategytype();
								  searchstrategydependency = tiposfiltros.getFilters().getStrategydependency();
								   searchType = tiposfiltros.getFilters().getUnittype();
								  orderIn = tiposfiltros.getOrder();
								  offsetIn = tiposfiltros.getOffset();
								  numofrecordsIn = tiposfiltros.getNumofrecords();
								  //se verifica si viene el content null o not null para insertar en la tabla access para el armado de los shorcuts
								  contentIn = tiposfiltros.getContent();
								  if (contentIn !=null) {
								  menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());
								  }
								  							
							
						 } 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);
						 }
					}
					
					//String Cadena = "elemento ->>";
												
				try {								

					
					String SentenciaBase = "SELECT  ed.id, ed.status, e.id AS idgeneral,  e.name AS estrageneral, "
							+ "    ( "
							+ "        SELECT STRING_AGG(CAST(u.id AS TEXT), ',') "
							+ "        FROM main.strategiesdetunits eu "
							+ "        JOIN main.units u ON u.id = eu.unitid "
							+ "        WHERE eu.strategydetid = ed.id "
							+ "    ) AS idunits, "
							+ "    ( "
							+ "        SELECT STRING_AGG(u.name, ',') "
							+ "        FROM main.strategiesdetunits eu "
							+ "        JOIN main.units u ON u.id = eu.unitid "
							+ "        WHERE eu.strategydetid = ed.id "
							+ "    ) AS nameunits, "
							+ "    ( "
							+ "		SELECT STRING_AGG(CAST(up1.processid AS TEXT), ',')   "
							+ "		 FROM main.strategiesdetprocesses sp   "
							+ "		 JOIN main.unitprocesses up1 ON sp.unitprocessid = up1.id   "
							+ "		 WHERE sp.strategyid = ed.id   "
							+ "		) AS idproccess,   "
							+ "    ( "
							+ "		SELECT STRING_AGG(p.name, ',')   "
							+ "		FROM main.strategiesdetprocesses sp   "
							+ "		JOIN main.unitprocesses up2 ON sp.unitprocessid = up2.id "
							+ "	    JOIN main.processes p ON up2.processid = p.id "
							+ "		WHERE sp.strategyid = ed.id   "
							+ "		 ) AS nameprocces,   "
							+ " pr.descr AS desctipo, pr.valor AS valortipo, pr2.descr AS descdepen,pr2.valor AS valordepen, "
							+ "    coalesce(su.id, 0) AS idsupli, coalesce(su.name, '') AS namesupli, coalesce(ap.id, 0) AS idappli, coalesce(ap.name, '') AS nameappli, "
							+ "    coalesce(re.id, 0) AS idresor,coalesce(re.name, '') AS nameresor,coalesce(fa.id, 0) AS idfac,coalesce(fa.name, '') AS namefa, "
							+ "    coalesce(po.id, 0) AS idposi, coalesce(po.name, '') AS nameposi,coalesce(ch.id, 0) AS idchannel,coalesce(ch.name, '') AS namechannel, "
							+ "    ed.dsc AS desddetallada, e.dsc AS desgeneral, "
							+ "    CASE "
							+ "        WHEN coalesce(ap.name, '') <> '' THEN coalesce(ap.name, '') "
							+ "        WHEN coalesce(re.name, '') <> '' THEN coalesce(re.name, '') "
							+ "        WHEN coalesce(po.name, '') <> '' THEN coalesce(po.name, '') "
							+ "        WHEN coalesce(su.name, '') <> '' THEN coalesce(su.name, '') "
							+ "        WHEN coalesce(fa.name, '') <> '' THEN coalesce(fa.name, '') "
							+ "        WHEN coalesce(ch.name, '') <> '' THEN coalesce(ch.name, '') "
							+ "        ELSE NULL "
							+ "    END AS depencombi, "
							+ "    ed.name AS nameestdet, "
							+ "    ( "
							+ "        SELECT CAST(COUNT(cp_inner.id) AS INTEGER) "
							+ "        FROM main.coverageprocesses cp_inner "
							+ "        LEFT JOIN main.strategiesdetprocesses sp_inner ON cp_inner.strategiesdetprocessid = sp_inner.id "
							+ "        LEFT JOIN main.strategiesdetunits eu_inner ON cp_inner.strategiesdetunitid = eu_inner.id "
							+ "        WHERE eu_inner.strategydetid = ed.id "
							+ "          AND ( "
							+ "                (sp_inner.id IS NOT NULL AND cp_inner.strategiesdetprocessid = sp_inner.id) "
							+ "                OR "
							+ "                (sp_inner.id IS NULL AND pr.descr = 'BCP') "
							+ "              ) "
							+ "    ) AS coverage_history_process_count, "
							+ "    ( "
							+ "        SELECT CAST(COUNT(ca_inner.id) AS INTEGER) "
							+ "        FROM main.coverageapps ca_inner "
							+ "        WHERE ca_inner.strategiesdetid = ed.id "
							+ "    ) AS coverage_history_app, "
							+ "    ( "
							+ "        SELECT CAST(COUNT(cc_inner.id) AS INTEGER) "
							+ "        FROM main.coveragechannels cc_inner "
							+ "        WHERE cc_inner.strategiesdetid = ed.id "
							+ "    ) AS coverage_history_channels, "
							+ "    ed.supplieridusr, "
							+ "    e.strategydependencypar, "
							+ "    ( "
							+ "		SELECT STRING_AGG(CAST(p.status AS TEXT), ',')   "
							+ "		 FROM main.strategiesdetprocesses sp   "
							+ "		 JOIN main.unitprocesses up3 ON sp.unitprocessid = up3.id "
							+ "	     JOIN main.processes p ON up3.processid = p.id "
							+ "		 WHERE sp.strategyid = ed.id   "
							+ "		) AS statusprocces,   "
							+ "    ( "
							+ "        SELECT STRING_AGG(CAST(u.status AS TEXT), ',') "
							+ "        FROM main.strategiesdetunits eu "
							+ "        JOIN main.units u ON u.id = eu.unitid "
							+ "        WHERE eu.strategydetid = ed.id "
							+ "    ) AS statusunits, "
							+ "    ( "
							+ "        SELECT STRING_AGG(COALESCE(CAST(up.deleted AS TEXT), 'v'), ',') "
							+ "        FROM main.strategiesdetprocesses sp "
							+ "        JOIN main.unitprocesses up ON sp.unitprocessid = up.id "
							+ "        WHERE sp.strategyid = ed.id "
							+ "    ) AS deleterela, "
							+ "    ( "
							+ "        SELECT STRING_AGG(COALESCE(CAST(sp.unitprocessid AS TEXT), 'v'), ',') "
							+ "        FROM main.strategiesdetprocesses sp "
							+ "        JOIN main.unitprocesses up ON sp.unitprocessid = up.id "
							+ "        WHERE sp.strategyid = ed.id "
							+ "    ) AS unitprorela "
							+ "FROM "
							+ "    main.strategiesdet ed "
							+ "LEFT JOIN main.strategies e ON e.id = ed.strategyid "
							+ "LEFT JOIN "
							+ "    ( "
							+ "        SELECT elemento ->> 'dsc' AS descr, elemento ->> 'value' AS valor "
							+ "        FROM main.params p_inner, jsonb_array_elements(CAST(p_inner.value AS jsonb)) AS elemento "
							+ "        WHERE p_inner.paramname = 'STRATEGY_TYPE' "
							+ "    ) pr ON e.strategytypepar = CAST(pr.valor AS integer) "
							+ "LEFT JOIN "
							+ "    ( "
							+ "        SELECT elemento ->> 'dsc' AS descr, elemento ->> 'value' AS valor "
							+ "        FROM main.params p_inner, jsonb_array_elements(CAST(p_inner.value AS jsonb)) AS elemento "
							+ "        WHERE p_inner.paramname = 'STRATEGY_DEPENDENCY' "
							+ "    ) pr2 ON e.strategydependencypar = CAST(pr2.valor AS integer) "
							+ " LEFT JOIN main.suppliers su ON ed.supplierid = su.id "
							+ " LEFT JOIN main.applications ap ON ed.applicationid = ap.id "
							+ " LEFT JOIN main.resources re ON ed.resourceid = re.id "
							+ " LEFT JOIN main.facilities fa ON ed.facilityid = fa.id "
							+ " LEFT JOIN main.positions po ON ed.positionid = po.id "
							+ " LEFT JOIN main.channels ch ON ed.channelid = ch.id "
							+ " LEFT JOIN main.strategiesdetunits eu ON eu.strategydetid = ed.id "
							+ "WHERE 1 = 1 ";	
							 
					 String SetenciaDependencia= "SELECT  elemento ->> 'dsc' AS descr,elemento ->> 'value' AS valor "
					 		+ " FROM main.params p, jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento WHERE paramname = 'STRATEGY_DEPENDENCY' ORDER BY valor ASC";
					 
					 //String SetenciaTypes= "SELECT  elemento ->> 'dsc' AS descr,elemento ->> 'value' AS valor "
						// 		+ " FROM main.params p, jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento WHERE paramname = 'STRATEGY_TYPE' ORDER BY valor ASC";
					 
					 String SetenciaTypes= " SELECT elemento ->> 'dsc' AS descr, elemento ->> 'value' AS valor FROM  main.params p, jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento"
					+ " WHERE p.paramname = 'STRATEGY_TYPE'" ;
					// rolisvalidDRP = 0;
					 if (rolisvalidDRP==0) {
						 SetenciaTypes = SetenciaTypes + " AND CAST(elemento ->> 'value' AS integer) =" + 1;
					 } else
					 {
						 SetenciaTypes = SetenciaTypes;
					 }
					 
					 
									
					String QueryTotal = "";
				//	String SentenciaBase = "";
					String name = "ed.dsc";
					String status = "ed.status";				
					String lowername = "LOWER(ed.dsc)";
					String LowerSearch = searchIn.toLowerCase();
				
					 
					 switch (searchStatus) { 
					    case 0:  // Busca por cualquier estatus
					    	//QueryTotal = SentenciaBase + " WHERE 1 = 1 ";
					    	QueryTotal = SentenciaBase;
					    	//QueryTotal = SentenciaBase;
					     break;
					    case 1:  // Busca por estatus activo
					    	
					        QueryTotal = SentenciaBase  + " AND " + status + " = " + searchStatus;
					    	//QueryTotal = SentenciaBase  + " AND " + status + " = " + searchStatus;
					     break;
					    case 2:  // Busca por estatus Inactivo
					    					    	
					    //	QueryTotal = SentenciaBase  + " WHERE " + "u.status" + " = " + 0;
					    	QueryTotal = SentenciaBase  + " AND " + "ed.status" + " = " + 0;
					     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);
					    	
			         }
					 
					 
					 switch (isWorker) {  /// VALIDAMOS SI ES PROVEEDOR PARA CUMPLIR ESTE CRITERIO >>Si el usuario es un proveedor, se deben filtrar las estrategias por el supplierid
					    case "SI":  // Busca por cualquier estatus
					    	
					    	String listunidades = strategiesdetRepository.getUnitByIduser(encontreSessionUsuario.get().getId());
					   	
					    	//QueryTotal = QueryTotal  + " AND (u.id IN (" + listunidades + ") OR u.id is null) ";
					    	QueryTotal = QueryTotal  + " AND (eu.unitid IN (" + listunidades + ") OR eu.id is null)";
					    	/*QueryTotal = QueryTotal  + " AND ed.id IN ( "
					    			+ "    SELECT eu.strategydetid "
					    			+ "    FROM main.strategiesdetunits eu "
					    			+ "    WHERE eu.unitid IN (" + listunidades + "))";*/
					    	 switch (rolisvalidDRP) {   // filtra las estrategias de tipp DRP, solo se pueden ver si tienes el privilegio creado para tal fin.
							    case 0:  //No tiene el privilegio para ver cualquier tipo de estrategia
							    	
							    	QueryTotal = QueryTotal + " AND pr.descr = " + "'" +  "BCP"  +"'"  ;
							     break;
							 
							         
							    default:	// tiene el privilegio para ver cualquier tipo de estrategia	
							    	
							    	QueryTotal = QueryTotal;
							     
					         }									 					
							 
					    	//QueryTotal = QueryTotal + " AND su.id = " + idsupplier;
					     break;
					
					    default:	// viene con el parametro para buscar por el like		   			    				    	
					    	
					    	QueryTotal = QueryTotal;
			         }
					 
					 if (isSystem =="SI") {
						 
						 String listunidades = strategiesdetRepository.getUnitByIduser(encontreSessionUsuario.get().getId());
						   	
					    //	QueryTotal = QueryTotal  + " AND (u.id IN (" + listunidades + ") OR u.id is null) ";	
						 QueryTotal = QueryTotal  + " AND (eu.unitid IN (" + listunidades + ") OR eu.id is null)";
							/*QueryTotal = QueryTotal  + " AND ed.id IN ( "
					    			+ "    SELECT eu.strategydetid "
					    			+ "    FROM main.strategiesdetunits eu "
					    			+ "    WHERE eu.unitid IN (" + listunidades + "))";*/
					    	 switch (rolisvalidDRP) {   // filtra las estrategias de tipp DRP, solo se pueden ver si tienes el privilegio creado para tal fin.
							    case 0:  //No tiene el privilegio para ver cualquier tipo de estrategia
							    	
							    	QueryTotal = QueryTotal + " AND pr.descr = " + "'" +  "BCP"  +"'"  ;
							     break;
							 
							         
							    default:	// tiene el privilegio para ver cualquier tipo de estrategia	
							    	
							    	QueryTotal = QueryTotal;
							     
					         }									 					
							 
						 
					 }
					 
					 
					
					 
					 
					 
					 switch (isSupplier) {  /// VALIDAMOS SI ES PROVEEDOR PARA CUMPLIR ESTE CRITERIO >>Si el usuario es un proveedor, se deben filtrar las estrategias por el supplierid
					    case "SI":  // Busca por cualquier estatus.
					    	String listunidades = strategiesdetRepository.getUnitByIduser(encontreSessionUsuario.get().getId());
					    	Suppliers idproveedoruser = encontreSessionUsuario.get().getSupplierid();
					    	int idprouser = idproveedoruser.getId();
					  
					    	QueryTotal = QueryTotal  + " AND (eu.unitid IN (" + listunidades + ") OR eu.id is null)";
					    	
					    	 switch (rolisvalidDRP) {   // filtra las estrategias de tipp DRP, solo se pueden ver si tienes el privilegio creado para tal fin.
							    case 0:  //No tiene el privilegio para ver cualquier tipo de estrategia
							    	
							    	//QueryTotal = QueryTotal + " AND pr.descr = " + "'" +  "BCP"  +"'"  ;
							    	QueryTotal = QueryTotal  + " AND ( ed.supplieridusr = " + idprouser + " OR pr.descr = 'BCP')";
							    	//(pr.descr = 'BCP' OR ed.supplieridusr = 226)
							     break;
							 
							         
							    default:	// tiene el privilegio para ver cualquier tipo de estrategia	
							    	
							    	QueryTotal = QueryTotal + " AND ( "
							    			+ "    pr.descr = 'BCP' "
							    			+ "    OR (pr.descr = 'DRP' AND ed.supplieridusr = " + idprouser + " ) "
							    			+ "    OR (pr.descr <> 'BCP' AND pr.descr <> 'DRP' AND ed.supplieridusr = " + idprouser +") "
							    			+ ") ";
							     
					         }				
					    		
					    //	}
					    	  
					    	//QueryTotal = SentenciaBase;
					     break;
					
					    default:	// viene con el parametro para buscar por el like		   			    				    	
					    	QueryTotal = QueryTotal;
					    	
			         }
					 
					 
					
					 
					 switch (searchIdStrategyGeneral) { 
					    case 0:  // Busca por cualquier estatus
					    	QueryTotal = QueryTotal;
					     break;
					  
					    default:	// viene con el parametro para buscar por el like		   			    				    	
					    	QueryTotal = QueryTotal + " AND  e.id = " + searchIdStrategyGeneral;
					    	
			         }
					// AND CAST(u.id AS TEXT) LIKE '%4%'
					 switch (searchUnitid) { 
					    case 0:  // Busca por cualquier estatus
					    	QueryTotal = QueryTotal;
					     break;
					  
					    default:	// viene con el parametro para buscar por el like		   			    				    	
					    //	QueryTotal = QueryTotal + " AND CAST(u.id AS TEXT) LIKE " + "'%" + searchUnitid + "%'";
					    	QueryTotal = QueryTotal +  " AND (CONCAT(',', eu.unitid, ',') LIKE '%," + searchUnitid + ",%')";
					   
					    	       					    	           	
			         }
					 switch (searchStrategytype) { 
					    case "":  // Busca por Tipo de Estrategia
					    	
					    	QueryTotal = QueryTotal;
					     break;
					    default:			   			    				    	
					    	QueryTotal = QueryTotal + " AND  pr.valor = " + "'" + searchStrategytype + "'";
					    	
			         }
					 
					 switch (searchstrategydependency) { 
					    case "":  // Busca por tipo de dependencia
					    	
					    	QueryTotal = QueryTotal;
					     break;
					   
					    default:			
					    	
					    	QueryTotal = QueryTotal + " AND  pr2.valor = " + "'" + searchstrategydependency + "'";					    						   
					    	
			         }
					 
						//String lowerparam = "main.sinacentos(LOWER(u.paramname))";
						String lowerdsc = "main.sinacentos(LOWER(ed.dsc))";
						String lowernamestra = "main.sinacentos(LOWER(ed.name))";
						String lowernamestraGene = "main.sinacentos(LOWER(e.name))";
					
					 switch (searchIn) { 
					    case "":  // viene sin busqueda por el like
					    	
					    	QueryTotal = QueryTotal;
					     break;
					  
					    default:	// viene con el parametro para buscar por el like		   			    				    	
					    	QueryTotal = QueryTotal + " AND ( " + lowerdsc + " LIKE " + "'%" + LowerSearch + "%'" + " OR " + lowernamestra + " LIKE " + "'%" + LowerSearch + "%'" + " OR " + lowernamestraGene + " LIKE " + "'%" + LowerSearch + "%')";
					    	//e.name
					    	
			         }
					 
					 
				
					 String groupby =" GROUP BY "
							 + "   ed.id, ed.status, e.id, e.name, pr.descr, pr.valor, pr2.descr, pr2.valor, su.id, su.name, ap.id, ap.name, "
							 + "   re.id, re.name, fa.id, fa.name, po.id, po.name, ch.id, ch.name, ed.name, ed.supplieridusr, ed.dsc, e.dsc, e.strategydependencypar";
					  
					 QueryTotal = QueryTotal + groupby;
					 	 
					 Query query = entityManager.createNativeQuery(QueryTotal);
					 cuantosregistro = (long) query.getResultList().size();
					 
				
				
					 String ordena="";
					  if (orderIn == 1 || orderIn == 2 || orderIn == 3 ||  orderIn == 4 ||  orderIn == 5 || orderIn == 99) {
						  ordena = " ASC";
					 }  else if (orderIn == -1 || orderIn == -2 || orderIn == -3 ||  orderIn == -4 ||  orderIn == -5 || orderIn == -99) {
						  ordena = " DESC";
					 } 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);
					 }
				
					 int absolutoOrden = Math.abs(orderIn);
					 
					 switch (absolutoOrden) { 
					    case 1:  //ordena por dsc ascendente
					    	
					    	//QueryTotal = QueryTotal + " ORDER BY " + " pr2.descr " + ordena;
					    	QueryTotal = QueryTotal + " ORDER BY " + " pr.descr " + ordena + ", ed.name " + ordena;
					     break;
					    case 2:   //ordena por status ascendente
					    		QueryTotal = QueryTotal + " ORDER BY " + " depencombi " + ordena + ", ed.name " + ordena;
					    						    						    					    					    			    						    
					    	
					    	
					     break;
	                    case 3:   //ordena por status ascendente
					    	
					    	QueryTotal = QueryTotal + " ORDER BY " + " e.name " + ordena;
					     break;
	                     
                         case 4:   //ordena por status ascendente
					    	
					    	QueryTotal = QueryTotal + " ORDER BY " + " ed.name " + ordena;
					     break;
					     
                         case 5:   //ordena por status ascendente
 					    	
 					    	QueryTotal = QueryTotal + " ORDER BY " + " ed.status " + ordena;
 					     break;
					     
	                    case 99:   //ordena por status ascendente
	                    	
		                    QueryTotal = QueryTotal + " ORDER BY " + "ed.id" + ordena;
	                    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);
					    
					   }
					 
			
					       Query queryTypes = entityManager.createNativeQuery(SetenciaTypes);
					       List<Object[]> listatipos= queryTypes.getResultList();
					       for (Object[] types : listatipos) {
					    	   detalleTypes = new TypesUnitDto();
					    	  					    	   					    	   					    						    	  
					    		    detalleTypes.setDsc((String) types[0]);
						    	    detalleTypes.setValue((String) types[1]);
					    		    listasTypes.add(detalleTypes);   
					    	   
					    	  
					       }
					       
					       Query queryDependencia= entityManager.createNativeQuery(SetenciaDependencia);
					       List<Object[]> listadepen= queryDependencia.getResultList();
					       for (Object[] types : listadepen) {
					    	   detalleTypesD = new TypesUnitDto();
					    	  
					    	   detalleTypesD.setDsc((String) types[0]);
					    	   detalleTypesD.setValue((String) types[1]);
					    	   listasTypesD.add(detalleTypesD);
					       }
					       
					       query = entityManager.createNativeQuery(QueryTotal);
					       query.setFirstResult(offsetIn);
						   query.setMaxResults(numofrecordsIn);
						   List<Object[]> listacompleta = query.getResultList();
					    
				    		   for (Object[] reg : listacompleta) {
				    		 
				    		   detalleStatus = new StatusDto();
				    		   detalleType = new TypeUnitDto();
				    		   detalleRecord = new StrategiesDetRecordDto();
				    		   detalleFacility = new FacilityDto();
				    		   detalleTypeStrategy = new  TypeStrategiDetDto();
				    		   detalleStrategy = new  StrategyDetDto();
				    		   detalleTipoDependencia = new  StrategiesDependencyDetDto();
				    		   
				    		   detalleRecord.setId((int) reg[0]);
				    		  // detalleRecord.setDsc((String) reg[24]);
				    		   detalleRecord.setName((String) reg[27]);
				    		   detalleStatus.setId((int) reg[1]);
				    		   
				    		   if ((int) reg[1]==1) {
				    			   detalleStatus.setName("Activo");
				    			   
				    		   } else
				    		   {
				    			   detalleStatus.setName("Inactivo");
				    		   }
				    		   
				    		   detalleRecord.setStatus(detalleStatus);
				    		   
				    		  // LLeno primero el type de Estrategia
				    		    
				    		   detalleTypeStrategy.setId((String) reg[9]);
				    		   detalleTypeStrategy.setDsc((String) reg[8]);
				    		   
				    		   // ahora si lleno la estrategia 
				    		   String valorIdEstPadre = (String) reg[2].toString();
				    		   detalleStrategy.setId(valorIdEstPadre);
				    		   detalleStrategy.setName((String) reg[3]);
				    		   detalleStrategy.setType(detalleTypeStrategy);
				    		   
				    		   detalleRecord.setStrategy(detalleStrategy);
				    		   
				    		   //vamos a setear las unidades asociadas a la estrategia
				    		   
				    		   String IdUniString = (String) reg[4]; // AQUI VIENEN LOS ID DE LAS UNIDADES
				    		   String NameUniString = (String) reg[5]; // AQUI VIENEN LOS NOMBRES  DE LAS UNIDADES
				    		   String StaUniString = (String) reg[34]; // AQUI VIENEN LOS status  DE LAS UNIDADES
				    		   listasUnits = new ArrayList<>();
							    if (IdUniString != null && !IdUniString.isEmpty()) {
							    	
							        String[] UniIds = IdUniString.split(",");
							        String[] UniNames = NameUniString.split(",");
							        String[] UniSta = StaUniString.split(",");
							        int i = 0;
							        
							        for (String uniId : UniIds) {
							        	
							        	//detalleUnits = new UnitsUsersDto();
							        	detalleUnits2 = new UnitsUsersDto2();
							        	
							        //	can.add(Integer.parseInt(uniId));
							        	String Nombreuni = UniNames[i];
							        	String Stauni = UniSta[i];
							        	 detalleUnits2.setId(Integer.parseInt(uniId));
							        	 detalleUnits2.setName(Nombreuni);
							        	 detalleUnits2.setStatus(Integer.parseInt(Stauni));
								    	  listasUnits.add(detalleUnits2);
							        	i = i+1;
							        }
							    }  else {
							    	listasUnits = new ArrayList<>();
							    	System.out.print(IdUniString);
							    	detalleUnits2 = new UnitsUsersDto2();
							    	//listasUnits = new ArrayList<>();
							    	//  detalleUnits.setId(0);
							    	 // detalleUnits.setName(null);
							    	  //listasUnits.add(detalleUnits);
							    }		
							    
							    detalleRecord.setUnits(listasUnits);
				    		   /////////////////////////////////////////////////////////
							    
							    /////////////VAMOS A SETEAR LOS PROCESOS ASOCIADOS A LA ESTRATEGIA
							    
							    String IdProString = (String) reg[6]; // AQUI VIENEN LOS ID DE LOS PROCESOS
					    		String NameProString = (String) reg[7]; // AQUI VIENEN LOS NOMBRES  DE LOS PROCESOS
					    		String StaProString = (String) reg[33]; // AQUI VIENEN LOS STATUS  DE LOS PROCESOS
					    		String DeleteProString = (String) reg[35]; // AQUI VIENEN LOS DELETE  DE LOS PROCESOS
					    		String UnitProString = (String) reg[36]; // AQUI VIENEN LOS UNITPROCESSID  DE LOS PROCESOS
								    if (IdProString != null && !IdProString.isEmpty()) {
								    	
								        String[] ProIds = IdProString.split(",");
								        String[] ProNames = NameProString.split(",");
								        String[] ProSta = StaProString.split(",");
								        String[] ProDelete = DeleteProString.split(",");
								        String[] ProUnitPro = UnitProString.split(",");
								        
								        int i = 0;
								        listasProcess = new ArrayList<>();
								        for (String proId : ProIds) {
								        	detalleProce = new UnitsUsersDto();
								        	detalleProce2 = new UnitsUsersDto4();
								        //	can.add(Integer.parseInt(uniId));
								        	String NombrePro = ProNames[i];
								        	String StatusPro = ProSta[i];
								        	String DeletePro = ProDelete[i];
								        	String UnitproPro = ProUnitPro[i];
								        	
								        	detalleProce2.setId(Integer.parseInt(proId));
								        	detalleProce2.setName(NombrePro);
								        	detalleProce2.setStatus(Integer.parseInt(StatusPro));
								        	
								        	if (DeletePro.length()==1) {
								        		detalleProce2.setDeleted(false);
								        	} else if (DeletePro.length()>1) {
								        		boolean valor = false;
								        		detalleProce2.setDeleted(true);
								        	} else {
								        		detalleProce2.setDeleted(false);
								        	}
								        	
								        	
								        		
								        if (UnitproPro.length()>1) {
								        	      detalleProce2.setUnitprocess(Integer.parseInt(UnitproPro));
								        	} else {
								        		   detalleProce2.setUnitprocess(0);
								        	}
									    	  listasProcess.add(detalleProce2);
								        	i = i+1;
								        }
								    }  else {
								    	System.out.print(IdProString);
								    	detalleProce2 = new UnitsUsersDto4();
								    	
								    	
								    }			
								    detalleRecord.setProcesses(listasProcess);
							    ////////////////////////////////////////////////////////////////////
				    		   /////////DATOS DE LA DEPENDENCIA//////////
								    //  0 es.detalla.id , 1 status, 2 estra general id, 3 name est gral, 4 idunidades, 5 nombreunidades,
									// 6 idprocesos, 7 nombreprocesos, 8 tipo estrategia, 9 valor tipo, 10 des dependencia, 11 valor tipo dependencia,
									// 12 id supli, 13 name suppli, 14 id aplica, 15 name applicati,16 id resour, 17 name resource,18 id facility, 19 name facility,20 id cargo, 21 name cargo
								    
								    if ((int) reg[12]!=0) {
								    	int iddepdencia = (int) reg[12];
								    	detalleTipoDependencia.setDependencyid(iddepdencia);
								    	detalleTipoDependencia.setDependencyname((String) reg[13]);
								    }
                                    if ((int) reg[14]!=0) {
                                    	int iddepdencia = (int) reg[14];
                                    	detalleTipoDependencia.setDependencyid(iddepdencia);
                                    	detalleTipoDependencia.setDependencyname((String) reg[15]);
								    }
                                    if ((int) reg[16]!=0) {
                                    	int iddepdencia = (int) reg[16];
                                    	detalleTipoDependencia.setDependencyid(iddepdencia);
                                    	detalleTipoDependencia.setDependencyname((String) reg[17]);
								    }
                                    if ((int) reg[18]!=0) {
                                    	int iddepdencia = (int) reg[18];
                                    	detalleTipoDependencia.setDependencyid(iddepdencia);
                                    	detalleTipoDependencia.setDependencyname((String) reg[19]);
                                    }
                                    if ((int) reg[20]!=0) {
                                    	int iddepdencia = (int) reg[20];
                                    	detalleTipoDependencia.setDependencyid(iddepdencia);
                                    	detalleTipoDependencia.setDependencyname((String) reg[21]);
                                    }
                                    
                                    if ((int) reg[22]!=0) {
                                    	int iddepdencia = (int) reg[22];
                                    	detalleTipoDependencia.setDependencyid(iddepdencia);
                                    	detalleTipoDependencia.setDependencyname((String) reg[23]);
                                    }
                                    
                                   // idchannel,coalesce(ch.name,'') namechannel
								    	
								    detalleTipoDependencia.setId((String) reg[11]);
								    detalleTipoDependencia.setDsc((String) reg[10]);
								    
								    detalleRecord.setDependency(detalleTipoDependencia);
								    
								    Integer sumacoberturas = (int) reg[28] + (int) reg[29] + (int) reg[30];
								    
								    detalleRecord.setCoverages(sumacoberturas);
								    
							
								    
								    
								    
							   ////////////////////////	////////////////    
				    	
					    	  
								    listasRecord.add(detalleRecord);
				    	   }
				    	
				    	   
		      	    	 	detallePrivilege = new PrivilegesAllDto();
				    	  	/*detallePrivilege.setUpdate(true);
				    	  	detallePrivilege.setView(true);
				    	  	detallePrivilege.setAdd(true);
				    	  	detallePrivilege.setDelete(true);*/
				    	  	
				    		   boolean tieneView = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,310);
							   boolean tieneUpdate = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,311);
							   boolean tieneAdd = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,312);
							   boolean tieneDelete = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,313);
							   //existsByRolidAndPrivilegeid
							   
			      	    	 	detallePrivilege.setView(tieneView);
					    	  	detallePrivilege.setUpdate(tieneUpdate);		    	  
					    	  	detallePrivilege.setAdd(tieneAdd);
					    	  	detallePrivilege.setDelete(tieneDelete);
				    	
					    	  	strategyResponseDto.setNumofrecords(cuantosregistro);
				           //paramsResponseDto.setValidthru(ValidThrufechaSalida);
					    	  	strategyResponseDto.setSessionvalidthru(fechaComoCadena);		           
					    	  	strategyResponseDto.setRecords(listasRecord);
					    	  	strategyResponseDto.setPrivileges(detallePrivilege);	
					    	  	strategyResponseDto.setTypes(listasTypes);
					    	  	strategyResponseDto.setDependencies(listasTypesD);
				  						           
		                return ResponseEntity.ok(strategyResponseDto);

				
		       
				} catch (Exception e) {
		            // Manejo de excepciones
					respuesta= new RespuestaDto("Error interno del servidor", false);
					estatus=HttpStatus.INTERNAL_SERVER_ERROR;  
					
		        } finally {
			        if (entityManager != null && entityManager.isOpen()) {
			            entityManager.close();
			        }
			    }
				
				return new ResponseEntity(respuesta, estatus);
			
			}
	
	
	
	@PostMapping("/strategiesdet/{strategydetid}")
	public ResponseEntity<ParamsResponseDto> strategiesUpdate(HttpServletRequest request,@RequestBody StrategiesRequestDto datosStrategies,@PathVariable("strategydetid") final Integer strategydetid) throws ParseException, SQLException {
		
		
		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 idparametro = strategydetid;
		 Optional<Users> encontreSessionUsuario;
		 Integer idSupplier = 0;
		 int valor = idparametro;
		 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 existeEstDet = false;	       	       	  		
		   Date fecha2 = new Date();
		   Calendar calendar = Calendar.getInstance();
		   String tieneEvalString = "NO";
		   Statement sentenciaPreparada = null;
			Statement sentenciaPreparada2 = null;
			 Connection conexion2 = DriverManager.getConnection(conexion,userbd, passbd);
		 
			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);
  					   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);
  						   
  					    }
  					    
  					//  searchIn = tiposfiltros.getFilters().getSearch();

				      String Salida = usersService.verificarCaracteresValidosConRegex(datosStrategies.getName());
					  
					  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);
					  }
  					   
  					    //VERIFICO SI ES PROVEEDOR
  					  if (encontreSessionUsuario.get().getSupplierid()!=null) {
  						idSupplier=encontreSessionUsuario.get().getSupplierid().getId();
  					  }
					 //Actualiza o Incluye un registro de un usuario. (Si el unitid es 0 se incluye). (priv 111 MOD Y 112 INC)
					   if (idparametro==0) {
						   //el permiso es el 632
						   Roles roles = encontreSessionUsuario.get().getRolid();
						   int idrol = roles.getId();
						   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol,312);
						//   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 {
						   
						    existeEstDet =  strategiesdetRepository.existsById(idparametro);
						    //existeEstDet = true;
						   if (!existeEstDet) {
					    	    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 tieneEval = coverageprocesseshistoryRepository.existeStrategiesHistory(idparametro);
					    	    int tieneEvalpro = coverageprocessesRepository.existeStrategiesById(idparametro);
					    	    //int tieneEvalunit = coverageprocessesRepository.existeStrategiesById(idparametro);
					    	    //existeStrategiesById
					    	    
					    	    if (tieneEvalpro>0) {
					    	    	tieneEvalString = "SI";
					    	    	/* 	String var = "";
									boolean bloked = false;
									RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
									//respuestaDto.setBlocked(bloked);
									respuestaDto.setMsg("Llamada al servicio malformado - No se puede Actualizar posee Evaluaciones"); 
									return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);*/
					          }
					      } 
						  
					   
					   Roles roles = encontreSessionUsuario.get().getRolid();
					   int idrol = roles.getId();
					   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol,311);
					  // 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);
						   
					     }
					   } 
					   					 											   
					  	//	VALIDA QUE LA ESTRATEGIA GENERAL ASOCIADA EXISTA				                      					
                                          					                     						   
						   boolean existeEstGen =  strategiesRepository.existsById(datosStrategies.getStrategyid());
						   if (!existeEstGen) {
					    	    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 {
						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 {
			
			 
       	
			Integer valorParamsStraDepe = 0;
			Integer valorTipoEstrategia = 0;
			
			Units tipoUnits2=null;
			Units tipoUnits=null;
			Units tipoUnitsNew2=null;
			Optional<Units> nuevoinsertado = null;
			Unitprocesses tipoUsersUnits = new Unitprocesses();
			
			
			
			// String SetenciaTypesLevel= "SELECT CAST(strategydependencypar as text),CAST(strategytypepar as text) from main.strategies where id =" + datosStrategies.getStrategyid();
			String SetenciaTypesLevel= "SELECT strategydependencypar,strategytypepar from main.strategies where id =" + datosStrategies.getStrategyid();      
			            Query queryTypeslevel = entityManager.createNativeQuery(SetenciaTypesLevel);
					       List<Object[]> listatiposlevel= queryTypeslevel.getResultList();
					       for (Object[] types : listatiposlevel) {
					    	//   detalleTypelevel = new TypesUnitDto();
					    	  
					    	   valorParamsStraDepe=(int) types[0];
					    	   valorTipoEstrategia=(int) types[1];
					       }
			
			
		       
					       if (datosStrategies.getUnitsid()=="") {
					    	   
					    	   if (valorTipoEstrategia==1) {
					    	   
					    	      if (valorParamsStraDepe!=6) {
					    		   
					    		      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 {
					    	     if (valorTipoEstrategia==2) {
					    	    	 String var = "";
									  boolean bloked = false;
									  RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
									   //respuestaDto.setBlocked(bloked);
									  respuestaDto.setMsg("Llamada al servicio malformado-DRP no debe traer unidades");
									  //Error 400
									  return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
					    	    	 
					    	        
					    	     }
					       }
		       
			
			
			String dependencia;
			 switch (valorParamsStraDepe) { 
			    case 1:  // la dependencia es un recurso
			    	dependencia = "resourceid" ;
			    	queryUpdate = "resourceid="+ datosStrategies.getDependencyid() + ",applicationid=null,supplierid=null,facilityid=null,positionid=null,channelid=null";
			     break;
			    case 2:  // la dependencia es un cargo
			    	
			    	dependencia = "positionid" ;
			    	queryUpdate = "resourceid=null,applicationid=null,supplierid=null,facilityid=null,positionid=" + datosStrategies.getDependencyid() + ",channelid=null";
			    break;
			    case 3:  // la dependencia es un proveedor
			    					    	
			    	dependencia = "supplierid" ;
			    	queryUpdate = "resourceid=null,applicationid=null,supplierid=" + datosStrategies.getDependencyid() + ",facilityid=null,positionid=null,channelid=null";
			    break;
			    case 4:  // la dependencia es una ubicacion
			    	
			    	dependencia = "facilityid" ;			    	
			    	queryUpdate = "resourceid=null,applicationid=null,supplierid=null,facilityid= " + datosStrategies.getDependencyid() + ",positionid=null,channelid=null";
			    break;
			    case 5:  // la dependencia es un sistema
			    	
			    	dependencia = "applicationid" ;		
			    	queryUpdate = "resourceid=null,applicationid=" + datosStrategies.getDependencyid() + ",supplierid=null,facilityid=null,positionid=null,channelid=null";
			    
			    break;
                case 6:  // la dependencia es un sistema
			    	
			    	dependencia = "channelid" ;		
			    	queryUpdate = "resourceid=null,applicationid=null,supplierid=null,facilityid=null,positionid=null,channelid=" + datosStrategies.getDependencyid();
			    
			    break;
			    default:	// viene con el parametro para buscar por el like		   			    				    	
			    	String var2 = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
					respuestaDto= new RespuestaMsgDto("Error interno del servidor");
					estatus=HttpStatus.INTERNAL_SERVER_ERROR;   
					return new ResponseEntity(respuestaDto, estatus);
			    	
	         }
			 
			
		    
 			//(PreparedStatement sentenciaPreparada = conexion2.prepareStatement(sql))
 			
 			sentenciaPreparada = conexion2.createStatement();
 			sentenciaPreparada2 = conexion2.createStatement();
 					
			if (idparametro==0) {
				
				 if (datosStrategies.getName()!="") {
				      boolean existeName =  strategiesdetRepository.existsByName(datosStrategies.getName());
				      
				         if (existeName) {
				        	 String var = "";
								boolean bloked = false;
								RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
								//respuestaDto.setBlocked(bloked);
								respuestaDto.setMsg("Registro duplicado."); 
								return new ResponseEntity(respuestaDto, HttpStatus.CONFLICT);
				         }
				       
				       
				   } else
				   {
					   String var = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						//respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Llamada al servicio malformado."); 
						return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
				   }
				   
							
				Strategiesdet strategies = new Strategiesdet();
				Strategiesdet strategies2 = new Strategiesdet();
				
					
				try {
					
					strategies.setStrategyid(datosStrategies.getStrategyid());
					strategies.setStatus(datosStrategies.getStatus());
					strategies.setDsc(datosStrategies.getDsc());
			    	strategies.setName(datosStrategies.getName());
					strategies.setCreatedat(fechaDate);
					strategies.setModifiedat(fechaDate);
					strategies.setSupplieridusr(idSupplier==0?null:idSupplier);
				
                    switch (valorParamsStraDepe) { 
    			    case 1:  // la dependencia es un recurso
    			    	strategies.setResourceid(datosStrategies.getDependencyid());
    			     break;
    			    case 2:  // la dependencia es un cargo    			    	
    			    	strategies.setPositionid(datosStrategies.getDependencyid());
    			    break;
    			    case 3:  // la dependencia es un proveedor
    			    	strategies.setSupplierid(datosStrategies.getDependencyid());
    			    break;
    			    case 4:  // la dependencia es una ubicacion
    			    	strategies.setFacilityid(datosStrategies.getDependencyid());
    			    break;
    			    case 5:  // la dependencia es un sistema
    			    	strategies.setApplicationid(datosStrategies.getDependencyid());
    			    
    			    break;
                    case 6:  // la dependencia es un sistema
                    	strategies.setChannelid(datosStrategies.getDependencyid());
    			    
    			    break;
    			    default:	// viene con el parametro para buscar por el like		   			    				    	
    			    	String var2 = "";
    					boolean bloked = false;
    					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
    					respuestaDto= new RespuestaMsgDto("Error interno del servidor");
    					estatus=HttpStatus.INTERNAL_SERVER_ERROR;   
    					return new ResponseEntity(respuestaDto, estatus);
    			    	
    	         }
    			 

                    strategies2 = strategiesdetRepository.save(strategies);
                    if (strategies2 != null) {	
			           Integer idinsertado = strategiesdetRepository.consultarmaxid();
			        
			    	  if (datosStrategies.getUnitsid()!="") {
                           queryInsertUnidades ="INSERT INTO main.strategiesdetunits (unitid,strategydetid) SELECT id," + idinsertado + " FROM main.units WHERE id IN (" + datosStrategies.getUnitsid() + ")";
                           sentenciaPreparada.execute(queryInsertUnidades);
			     	   }  
			    	
			        	if (datosStrategies.getUnitprocessesid()!="") {
                       //  queryInsertProcesses ="INSERT INTO main.strategiesdetprocesses (processid,strategyid) SELECT id," + idinsertado + " FROM main.processes WHERE id IN (" + datosStrategies.getProcessesid() + ")";
                         queryInsertProcesses ="INSERT INTO main.strategiesdetprocesses (unitprocessid,strategyid) SELECT id," + idinsertado + " FROM main.unitprocesses WHERE id IN (" + datosStrategies.getUnitprocessesid() + ")";

                         sentenciaPreparada.execute(queryInsertProcesses);
			         	}
			    				    				    
			         
			        //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
				     String module = "Estrategia Detallada";
				     String Descmodule = "Se agregó estrategia detallada con Id: " + idinsertado;
				    
			         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(idinsertado);
					
						estatus=HttpStatus.OK;
						return new ResponseEntity(respuestaValueDto, estatus);
                    }	else {
						respuesta.setMsg("Registro duplicado");
						estatus = HttpStatus.CONFLICT;
						return new ResponseEntity(respuesta, estatus);
					}
			     } catch (Exception e) {
			    	 
			    		respuesta= new RespuestaMsgDto("Llamada al servicio malformado");
						estatus=HttpStatus.BAD_REQUEST;
						return new ResponseEntity(respuesta, estatus);
				
			}
				
		        
	         

			} else {
				
				Strategiesdet strategies = new Strategiesdet();
				Strategiesdet strategiesdet = new Strategiesdet();
				Strategiesdet strategies2 = new Strategiesdet();
				
				 if (tieneEvalString!="SI") {
				
			     	if (existeEstDet) {
				     	 strategiesdetRepository.actualizardependencias(idparametro);
			    	 
					//datosStrategies.getName()
			           } 	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);
			    	  
			         }
				 }  
				
				//validacion de duplicidad del nuevo campo Nombre
				 Optional<Strategiesdet> obtStrategies = strategiesdetRepository.findById(idparametro);
				 strategiesdet = obtStrategies.get();
				
				String name1 = strategiesdet.getName();
				String name2 = datosStrategies.getName();
				String noduply = "NOOK";
				if (name1.equals(name2)){
					String ValidaName = "El nombre es el mismo";
			    	
				} else {
			
				 String QueryTotal = "SELECT name FROM main.strategiesdet WHERE LOWER(name) = " + "'" + datosStrategies.getName().toString().toLowerCase() + "'" ;
				 Long validaName = (long) jdbcTemplate.queryForList(QueryTotal).size();
				 
                if (validaName>0) {
					
					String var = "";
					//boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
					//respuestaDto.setBlocked(bloked);
					respuestaDto.setMsg("Registro Duplicado");
					//Error 400
					return new ResponseEntity(respuestaDto, HttpStatus.CONFLICT);
					
				} else {
					 noduply = "OK";
				}
			}	 //// fin de la validacion del nombre
				
				 
				try {
					
					// Optional<Strategiesdet> obtStrategies2 = strategiesdetRepository.findById(idparametro);
					// strategies = obtStrategies2.get();
					 strategies =  strategiesdet;
					 
					
					   
					 strategies.setStatus(datosStrategies.getStatus());
					 strategies.setDsc(datosStrategies.getDsc());
					 
					if (tieneEvalString!="SI") {
						 
					 
				//sentenciaPreparada.execute(queryUpdateAll);
					strategies.setStrategyid(datosStrategies.getStrategyid());
					
					strategies.setSupplieridusr(idSupplier==0?null:idSupplier);
					
					if (noduply== "OK") {
						strategies.setName(datosStrategies.getName());
						
					}
					
					
					strategies.setCreatedat(fechaDate);
					strategies.setModifiedat(fechaDate);
					
				
                    switch (valorParamsStraDepe) { 
    			    case 1:  // la dependencia es un recurso
    			    	
    			    	strategies.setResourceid(datosStrategies.getDependencyid());
    			     break;
    			    case 2:  // la dependencia es un cargo    			
    			    	strategies.setPositionid(datosStrategies.getDependencyid());
    			    break;
    			    case 3:  // la dependencia es un proveedor
    			    	strategies.setSupplierid(datosStrategies.getDependencyid());
    			    break;
    			    case 4:  // la dependencia es una ubicacion
    			    	strategies.setFacilityid(datosStrategies.getDependencyid());
    			    break;
    			    case 5:  // la dependencia es un sistema
    			    	strategies.setApplicationid(datosStrategies.getDependencyid());
    			    
    			    break;
                    case 6:  // la dependencia es un sistema
                    	
                    	strategies.setChannelid(datosStrategies.getDependencyid());
    			    
    			    break;
    			    default:	// viene con el parametro para buscar por el like		   			    				    	
    			    	String var2 = "";
    					boolean bloked = false;
    					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
    					respuestaDto= new RespuestaMsgDto("Error interno del servidor");
    					estatus=HttpStatus.INTERNAL_SERVER_ERROR;   
    					return new ResponseEntity(respuestaDto, estatus);
    			    	
    	         }
			}   
                    strategies2 = strategiesdetRepository.save(strategies);  
                    
                    int cuantoselimine;
                    int cuantosinserte;
                    boolean huboconflicto = false;                                                     		                
                
            	   
               //  List<Integer>  listadodelete =   strategiesdetunitsRepository.getUnitsDelete(idparametro,unidadesConca);
                    
             if (strategies2 != null) {	  
                	
                	 
                	// for (int i = 0; i < datosStrategies.getListunidades().size(); i++) {
                if (tieneEvalString!="SI") {
                    if (valorTipoEstrategia==1) {
                	
                	 try {
                		 
                	 boolean tieneunidades	 =  strategiesdetunitsRepository.existsByStrategydetid(strategies.getId());
                	 boolean tieneprocesos =  strategiesdetprocessesRepository.existsByStrategyid(strategies.getId());
                	 int cuantos=0;
                	 int cuantosProcesos=0;
                	 
                   	 if (datosStrategies.getUnitsid()!="") {
                	    List<Integer> intListStream = Arrays.stream(datosStrategies.getUnitsid().split(","))
                              .map(String::trim)
                              .map(Integer::parseInt)
                              .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
                         cuantos = intListStream.size();
                         
                         try {
                         //  String sql2 = " DELETE FROM main.Strategiesdetunits ed where  ed.strategydetid = " + datosStrategies.getStrategyid() + " AND ed.unitid NOT IN (" +  datosStrategies.getUnitsid() + ") AND ed.id NOT IN  "
                                   String sql2 = " DELETE FROM main.Strategiesdetunits ed where  ed.strategydetid = " + idparametro + " AND ed.unitid NOT IN (" +  datosStrategies.getUnitsid() + ") AND ed.id NOT IN  "

                          		+ "	( SELECT strategiesdetunitid from main.coverageprocesses where strategiesdetunitid is not null) ";
                 	          sentenciaPreparada2.execute(sql2);
                         }    catch (Exception e) {
                        	 respuesta.setMsg(" Quedaron entradas que poseen evaluaciones asociadas.");
  					         estatus = HttpStatus.CONFLICT;
  					         return new ResponseEntity(respuesta, estatus);
                         } 
                 	         for (int i = 0; i < cuantos; i++) {
                          	   
                          	   int idunidad = intListStream.get(i);
                          	   boolean existe = strategiesdetunitsRepository.existsByStrategydetidAndUnitid(idparametro,idunidad);
                          	   
                          	   if (existe) {
                          		   String d = "No hace nada";
                          	   } else
                          	   {
                          		   String s = "Aqui hago el insert";
                          		   queryInsertUnidades ="INSERT INTO main.strategiesdetunits (unitid,strategydetid) SELECT id," + idparametro + " FROM main.units WHERE id IN (" + idunidad + ")";
                                     sentenciaPreparada.execute(queryInsertUnidades);
                                     queryInsertUnidades="";
                                    // sentenciaPreparada = null;
                          	   }
                           	 
                      	 
                      	 
                              }
                   	 } else {
                   		 
                   		try {
                   			String comodin = "0";
                   			
                            //String sql2 = " DELETE FROM main.Strategiesdetunits ed where  ed.strategydetid = 3 AND ed.unitid NOT IN (" +  comodin + ") AND ed.id NOT IN  "
                           // String sql2 = " DELETE FROM main.Strategiesdetunits ed where  ed.strategydetid = " + datosStrategies.getStrategyid() + " AND ed.unitid NOT IN (" +  comodin + ") AND ed.id NOT IN  "
                            String sql2 = " DELETE FROM main.Strategiesdetunits ed where  ed.strategydetid = " + idparametro + " AND ed.unitid NOT IN (" +  comodin + ") AND ed.id NOT IN  " 		

                           		+ "	( SELECT strategiesdetunitid from main.coverageprocesses where strategiesdetunitid is not null) ";
                  	          sentenciaPreparada2.execute(sql2);
                          }    catch (Exception e) {
                         	 respuesta.setMsg(" Quedaron entradas que poseen evaluaciones asociadas.");
   					         estatus = HttpStatus.CONFLICT;
   					         return new ResponseEntity(respuesta, estatus);
                          } 
                   		 
                   	 }
                   	 
                   //	if (datosStrategies.getProcessesid()!="") {
                   	if (datosStrategies.getUnitprocessesid()!="") {	
                    // List<Integer> intListStreamProcesses = Arrays.stream(datosStrategies.getProcessesid().split(","))
                     List<Integer> intListStreamProcesses = Arrays.stream(datosStrategies.getUnitprocessesid().split(","))		 
                             .map(String::trim)
                             .map(Integer::parseInt)
                             .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
                      cuantosProcesos = intListStreamProcesses.size();
                      
                      try  {
                          //String sql3 = " DELETE FROM main.strategiesdetprocesses ed where  ed.strategyid = 3 AND ed.processid NOT IN (" +  datosStrategies.getProcessesid() + ") AND ed.id NOT IN  "
                         // String sql3 = " DELETE FROM main.strategiesdetprocesses ed where  ed.strategyid = " + datosStrategies.getStrategyid() + " AND ed.processid NOT IN (" +  datosStrategies.getProcessesid() + ") AND ed.id NOT IN  "   		  
                       	//	+ "	( SELECT strategiesdetprocessid from main.coverageprocesses) ";
                      //    String sql3 = " DELETE FROM main.strategiesdetprocesses ed where  ed.strategyid = " + datosStrategies.getStrategyid() + " AND ed.unitprocessid NOT IN (" +  datosStrategies.getUnitprocessesid() + ") AND ed.id NOT IN  "
                                  String sql3 = " DELETE FROM main.strategiesdetprocesses ed where  ed.strategyid = " + idparametro + " AND ed.unitprocessid NOT IN (" +  datosStrategies.getUnitprocessesid() + ") AND ed.id NOT IN  " 
                             		+ "	( SELECT strategiesdetprocessid from main.coverageprocesses where strategiesdetprocessid is not null) ";
                          
              	          sentenciaPreparada2.execute(sql3);
              	          
                   	     }    catch (Exception e) {
                   	  	       respuesta.setMsg(" Quedaron entradas que poseen evaluaciones asociadas.");
    					       estatus = HttpStatus.CONFLICT;
    					       return new ResponseEntity(respuesta, estatus);
                      	}
                          
                          for (int i = 0; i < cuantosProcesos; i++) {
                      	   
                      	    int idProcesses = intListStreamProcesses.get(i);
                      	  //  boolean existe = strategiesdetprocessesRepository.existsByStrategyidAndProcessid(idparametro,idProcesses);
                      	      boolean existe = strategiesdetprocessesRepository.existsByStrategyidAndUnitprocessid(idparametro,idProcesses);
                      	      if (existe) {
                      		      String d = "No hace nada";
                      	        } else
                      	         {
                      		    String s = "Aqui hago el insert";
                      		  //  queryInsertProcesses ="INSERT INTO main.strategiesdetprocesses (processid,strategyid) SELECT id," + idparametro + " FROM main.processes WHERE id IN (" + idProcesses + ")";
                      		    queryInsertProcesses ="INSERT INTO main.strategiesdetprocesses (unitprocessid,strategyid) SELECT id," + idparametro + " FROM main.unitprocesses WHERE id IN (" + idProcesses + ")";
                                  sentenciaPreparada.execute(queryInsertProcesses);
                                  queryInsertProcesses="";
                                 // sentenciaPreparada = null;
                      	       }
                       	 
                  	 
                  	 
                             }
                          
                   	}       else {
                   		
                   	      	String comodin2 = "0";
                     	    try  {
                                   // String sql3 = " DELETE FROM main.strategiesdetprocesses ed where  ed.strategyid = 3 AND ed.processid NOT IN (" +  comodin2 + ") AND ed.id NOT IN  "
                               //     String sql3 = " DELETE FROM main.strategiesdetprocesses ed where  ed.strategyid = " + datosStrategies.getStrategyid() + " AND ed.unitprocessid NOT IN (" +  comodin2 + ") AND ed.id NOT IN  "
                                      String sql3 = " DELETE FROM main.strategiesdetprocesses ed where  ed.strategyid = " + idparametro + " AND ed.unitprocessid NOT IN (" +  comodin2 + ") AND ed.id NOT IN  "            		
                      		        + "	( SELECT strategiesdetprocessid from main.coverageprocesses  where strategiesdetprocessid is not null) ";
             	                    sentenciaPreparada2.execute(sql3);
             	          
                  	          }    catch (Exception e) {
                  	  	           respuesta.setMsg(" Quedaron entradas que poseen evaluaciones asociadas.");
   					               estatus = HttpStatus.CONFLICT;
   					               return new ResponseEntity(respuesta, estatus);
                     	     } 
                   	}                                                                                                                                                     
                         

                	 }    catch (Exception e) {
                		 
                			respuesta.setMsg(" Error interno del Servidor.");
        					estatus = HttpStatus.INTERNAL_SERVER_ERROR;
        					return new ResponseEntity(respuesta, estatus);
                		 
                	 }
                } else
                {
                       strategiesdetunitsRepository.borrarStrategybyIdStrategyUnits(idparametro);
				       strategiesdetprocessesRepository.borrarStrategybyIdStrategy(idparametro);
                }
                }   
				
				  
			    //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
			     String module = "Estrategia Detallada";
			     //String Descmodule = "Actualización de parametro del Sistema con id: " + parmid  ;
			     String Descmodule = "Se actualizó estrategia con Id: "+ idparametro;
			    
		         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(idparametro);
					//int parmid = 2;
					//respuestaValueDto= new RespuestaValueDto(userid);
					estatus=HttpStatus.OK;
					return new ResponseEntity(respuestaValueDto, estatus);
					
               }	else { // este else es de la pregunta si la variavle strategies 2 viene false
					respuesta.setMsg("Registro duplicado");
					estatus = HttpStatus.CONFLICT;
					return new ResponseEntity(respuesta, estatus);
				}
                 
                 
		   	 }   catch (Exception e) {
		    	 
		    		respuesta= new RespuestaMsgDto("Llamada al servicio malformado");
					estatus=HttpStatus.BAD_REQUEST;
					return new ResponseEntity(respuesta, 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();
	        }
	    	try {
			   
			    if (sentenciaPreparada != null) {
			    	sentenciaPreparada.close();
			    } //sentenciaPreparada2
			    if (sentenciaPreparada2 != null) {
			    	sentenciaPreparada2.close();
			    } 
			    if (conexion2 != null) {
		            conexion2.close();
		        }
			} catch (SQLException e) {
			    // Maneja la excepción aquí, por ejemplo, imprimiendo el stack trace
			    e.printStackTrace();
			}
	    }
		
		return new ResponseEntity(respuesta, estatus);
	
	}


@DeleteMapping("/strategiesdet/{strategydetid}")
public ResponseEntity<?> borrarstrategiesdet(HttpServletRequest request, @PathVariable("strategydetid") final Integer strategydetid)
		throws ParseException {
	RespuestaMsgDto respuesta = new RespuestaMsgDto("");
	HttpStatus estatus = HttpStatus.FORBIDDEN;
	RoleDto detalleRoles;
	PrivilegesAllDto detallePrivilege;
	
	String var = "";
	boolean bloked = false;
	RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
	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();
	RespuestaValueDto respuestaValueDto;
	String searchIn = "";


	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, duracionSession); // horasASumar es int.
	Date ValidThrufechaSalida = calendar.getTime(); // Y ya tienes la fecha sumada.

	if (sessionid == null) {
		respuesta.setMsg("Llamada al servicio malformado");
		estatus=HttpStatus.BAD_REQUEST;
		return new ResponseEntity(respuesta, estatus);
	} else {
		sessionid = sessionid.substring(7);
		Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);

		if (encontreSessionUsuario.isPresent()) {
			//Eliminar un registro de un usuario. (priv 633)

			String fechaComoCadena;
			   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 var2 = "";
						boolean bloked2 = false;
						RespuestaMsgDto respuestaDto2 = new RespuestaMsgDto(var2);
						//respuestaDto.setBlocked(bloked);
						respuestaDto2.setMsg("Sesión expirada o inválida"); 
						return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
					   
				    }
				    
			  Roles roles = encontreSessionUsuario.get().getRolid();
			   int idrol = roles.getId();
			   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 313);
			 //  rolisvalid = 3;
			   if (rolisvalid==0) {
				  
				   
					//boolean bloked = false;
					RespuestaMsgDto respuestaPrivDto = new RespuestaMsgDto(var);
					//respuestaDto.setBlocked(bloked);
					respuestaPrivDto.setMsg("No tiene los Privilegios"); 
					return new ResponseEntity(respuestaPrivDto, HttpStatus.FORBIDDEN);
					
			   }
			   
			
			
		    	  
		    	  
			  
			   
			try {
				
				if (strategiesdetRepository.existsById(strategydetid)) {
					
					  int tieneEval = coverageprocesseshistoryRepository.existeStrategiesHistory(strategydetid);
			    	    
			    	    if (tieneEval>0) {
			    	    	
				
							respuesta.setMsg("Llamada al servicio malformado - No se puede Actualizar posee Evaluaciones ");
							estatus=HttpStatus.BAD_REQUEST;
							return new ResponseEntity(respuesta, estatus);
			          }
			     
					
					  //Optional<Units> uniDelete = unitsRepository.findById(unitid);
					     String module = "Estrategia Detallada";
					     String Descmodule = "Se eliminó estrategia con id : " + strategydetid;
					    
				         auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());
				         //SimpleDateFormat  formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				         //String dataFormattata = formatter.format(fecha);
				         //Date fechaDate = formatter.parse(dataFormattata);
				         
				         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); 
					
					// Borro el rol boolean existeUsers = ;
					int valor = 0;
					try {
					//usersRepository.deleteusersbyid(userid,fechaDate,valor);	
						strategiesdetRepository.deletestrategiesbyid(strategydetid);	
					respuestaValueDto= new RespuestaValueDto(strategydetid);
					
					
					estatus=HttpStatus.OK;
					return new ResponseEntity(respuestaValueDto, estatus);
					} catch (Exception e) {// Error Interno
						respuesta.setMsg("Error interno del servidor -conflicto. ");
						estatus=HttpStatus.CONFLICT;
						return new ResponseEntity(respuesta, estatus);
					} 
				} else {// Registro no encontrado
					respuesta.setMsg("Registro no encontrado");
					estatus=HttpStatus.NOT_FOUND;
					return new ResponseEntity(respuesta, estatus);
					
				}

			} catch (Exception e) {// Error Interno
				// Manejo de excepciones
				respuesta.setMsg("Error interno del servidor");
				estatus=HttpStatus.INTERNAL_SERVER_ERROR;
				return new ResponseEntity(respuesta, estatus);
			}
		} else {
			respuesta.setMsg("Sesión expirada o inválida");
			estatus=HttpStatus.UNAUTHORIZED;
			return new ResponseEntity(respuesta, estatus);
			
		}

		
	}
	
}	



}
