package com.dacrt.SBIABackend.controler;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.ArrayList;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.dao.DataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.validation.BindingResult;
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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.dacrt.SBIABackend.dto.CampaignFormat2Dto;
import com.dacrt.SBIABackend.dto.ChannelDto;
import com.dacrt.SBIABackend.dto.ChannelsAmountDto;
import com.dacrt.SBIABackend.dto.ChannelsDtoStatus;
import com.dacrt.SBIABackend.dto.ChannelsEntryDto;
import com.dacrt.SBIABackend.dto.ChannelsRecordDto;
import com.dacrt.SBIABackend.dto.Mensaje;
import com.dacrt.SBIABackend.dto.RecordCatalogoResponseDto;
import com.dacrt.SBIABackend.dto.ServiceOffersDescDto;
import com.dacrt.SBIABackend.dto.StatusDto;
import com.dacrt.SBIABackend.dto.StatusDto2;
import com.dacrt.SBIABackend.dto.SuppliersDto;
import com.dacrt.SBIABackend.dto.SuppliersDtoStatus;
import com.dacrt.SBIABackend.dto.TypesUnitDto;
import com.dacrt.SBIABackend.dto.UnitsDto;
import com.dacrt.SBIABackend.dto.UnitsUsersDto;
import com.dacrt.SBIABackend.dto.requestDto.ChannelsRequestDto;
import com.dacrt.SBIABackend.dto.requestDto.WorkersRequestBodyDto;
import com.dacrt.SBIABackend.dto.responseDto.ChannelEntryResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.ChannelsResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.SuppliersRespondeDto;
import com.dacrt.SBIABackend.entity.Channels;
import com.dacrt.SBIABackend.entity.Suppliers;
import com.dacrt.SBIABackend.entity.Units;
import com.dacrt.SBIABackend.entity.Userunits;
import com.dacrt.SBIABackend.entity.Vicepresidencies;
import com.dacrt.SBIABackend.entity.Workers;
import com.dacrt.SBIABackend.repository.ChannelsRepository;
import com.dacrt.SBIABackend.repository.SuppliersRepository;
import com.dacrt.SBIABackend.repository.UnitsRepository;
import com.dacrt.SBIABackend.security.dto.AuditAllDto;
import com.dacrt.SBIABackend.security.dto.AuditRequestDto;
import com.dacrt.SBIABackend.security.dto.EntryDto;
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.RolesResponseDto;
import com.dacrt.SBIABackend.security.dto.RolesUserDto;
import com.dacrt.SBIABackend.security.dto.SuppliersUsersDto;
import com.dacrt.SBIABackend.security.dto.UserDetailsResponseDto;
import com.dacrt.SBIABackend.security.dto.UserListDto;
import com.dacrt.SBIABackend.security.dto.UsersListDto;
import com.dacrt.SBIABackend.security.dto.UsersUnitDto;
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.enums.RolNombre;
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.RolesRepository;
import com.dacrt.SBIABackend.security.repository.UsersRepository;
import com.dacrt.SBIABackend.security.service.RolesService;
import com.dacrt.SBIABackend.security.service.SecurityService;
import com.dacrt.SBIABackend.security.service.MenuService;
import com.dacrt.SBIABackend.security.service.ParamsService;
import com.dacrt.SBIABackend.security.service.UsersService;
import com.dacrt.SBIABackend.service.ChannelsService;
import com.dacrt.SBIABackend.service.SuppliersService;
import com.dacrt.SBIABackend.service.WorkersService;
import com.dacrt.SBIABackend.utils.HttpReqRespUtils;


@RestController
//@RequestMapping("/units")   
@CrossOrigin(origins = "*")
public class ChannelsController {

	@Autowired
	private ParamsRepository paramsRepository;
	
	@Autowired
	private UsersRepository usersRepository;
	
	@Autowired
	private AuditRepository auditRepository;
	
	@Autowired
	private ChannelsRepository channelsRepository;
	
	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;
	
	@Autowired
	UsersService usersService;
	
	@Autowired
	ParamsService paramsService;
	
	@Autowired
	ChannelsService channelsService;
	
	@Autowired
	SecurityService securityService;
	
	@Autowired
	MenuService menuService;
	
	@PersistenceContext
    private EntityManager entityManager;
	
	@Autowired
	SuppliersRepository suppliersRepository;
	
	@Autowired
    private JdbcTemplate jdbcTemplate;
	
	@Value("${spring.datasource.url}")
	private String conexion;
	
	@Value("${spring.datasource.username}")
	private String userbd;
	
	@Value("${spring.datasource.password}")
	private String passbd;
	
	
	
	//@GetMapping("/menus)
	//public ResponseEntity<MenuResponseDto> menu(@PathVariable final String sessionid) throws ParseException {
	@PostMapping("/channels")
	public ResponseEntity<?> channels(HttpServletRequest request,@RequestBody UsersListDto tiposfiltros) throws ParseException, UnsupportedEncodingException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		ChannelsResponseDto channelsResponseDto = new ChannelsResponseDto();
		ChannelsRecordDto channelsRecordDto = new ChannelsRecordDto();
		RecordCatalogoResponseDto channelsFormatResponseDto = new RecordCatalogoResponseDto();
		CampaignFormat2Dto detalleCompaing2;
		int formatList = 0;
	//	ParamsDto detalleParams;
		CampaignFormat2Dto detalleSuppliers;
		StatusDto2 detalleStatus;
		StatusDto2 detalleType;
		StatusDto detalleStatus2;
		ChannelsAmountDto detalleAmountOP;
		ChannelsAmountDto detallevolumeOP;
		StatusDto2 detallecapacityperiod;
		ServiceOffersDescDto detalleserviceoffers;
		List<TypesUnitDto> listasTypes = new ArrayList<>();
		List<ServiceOffersDescDto> listasOfertas = new ArrayList<>();
		PrivilegesAllDto detallePrivilege;
		
	     
	     Long cuantosregistro = (long) 0;
	     
	     List<PrivilegesAllDto> listasPrivelege = new ArrayList<>();
	     List<ChannelsRecordDto> listasRecord= new ArrayList<>();
	     TypesUnitDto detalleTypes;
	     TypesUnitDto detallePeriodos;
	     List<TypesUnitDto> listasPeriodos = 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 idrol;
	   	  String searchIn = "";
	   	  String contentIn = "";
	     // String searchModule = "";
		  int searchStatus = 0;
		  int typeIn=0;
		  String fechaComoCadena; 
		 int orderIn = 0;
		 int offsetIn = 0;
		 int numofrecordsIn = 0;
		 Date fecha2 = new Date();
		
			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);
				   Optional<Users> encontreSessionUsuario =usersRepository.getBySessionid(sessionid);
				//   String usuarioIN = encontreSessionUsuario.get().getUsr();
				 //  int position = usuarioIN.indexOf('('); 
				   
				   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);
						   
					    }
					    formatList = tiposfiltros.getFormat();
					    
					    if (formatList==0) {
					    	formatList = 1;
					    } else {
					    	formatList = tiposfiltros.getFormat();
					    }
					  // Este proceso permite obtener un listado de los proveedores. (Priv 440)
					   Roles roles = encontreSessionUsuario.get().getRolid();
					   idrol = roles.getId();
					   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 220);
					   if (formatList!=2) {
					        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 = 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());
						   searchStatus = tiposfiltros.getFilters().getStatus();
					
						  orderIn = tiposfiltros.getOrder();
						  offsetIn = tiposfiltros.getOffset();
						  numofrecordsIn = tiposfiltros.getNumofrecords();
						  contentIn = tiposfiltros.getContent();
						 // String typeIn2 = tiposfiltros.getFilters().getType();
						  
						  
						  
						  
						  
						  try {
							  String typeIn2 = tiposfiltros.getFilters().getType();
							  typeIn  = Integer.parseInt(typeIn2);
								  if (typeIn==0) {
									  typeIn = 0;
								  }
								  
							  }  catch (Exception e) { 
								  
								  typeIn = 0;
								  
							  }
							
						  
						  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);
				 }
			}
			
			
		
		try {
			
			String SentenciaBase;
			if (formatList==2) {	
			   SentenciaBase = "SELECT  new com.dacrt.SBIABackend.dto.ChannelsDtoStatus "
						+ " (u.id,  u.name, u.status, "
						+ "	 CASE "
						+ "	WHEN u.status = 1 THEN 'Activo' "
						+ "	ELSE 'Inactivo' "
						+ "	END AS estatus ) "
						+ "	FROM "
						+ "	Channels u ";
			} else { 
			
			
		    	// SentenciaBase = "SELECT new com.dacrt.SBIABackend.dto.ChannelsDtoStatus (u.id,u.name,u.status,CASE WHEN u.status = 1 then 'Activo' ELSE 'Inactivo' END AS estatus) FROM Channels u";
				
				SentenciaBase = " SELECT u.id,u.name,u.status,CASE WHEN u.status = 1 THEN 'Activo' ELSE 'Inactivo' END AS estatus,u.dsc, "
					    + " u.amountop,u.volumeop ,CAST(u.customerqty AS INTEGER) AS customerqty ,CAST(u.capacity AS INTEGER) AS capacity ,"
					    + " CAST(u.capacityperiod AS INTEGER) AS capacityperiod,u.serviceoffers, "
					    + " CAST(u.channeltypepar AS TEXT) AS channeltypepar,pr.descr, "
					    + " STRING_AGG(s.name, ', ' ORDER BY service_ids.ord) AS nombres_ofertas_servicio_agrupados,pr1.descr AS desccapacity,"
					    + " STRING_AGG(CASE WHEN s_horario.offer_full = 1 THEN 'SI' ELSE 'NO' END, ', ' ORDER BY service_ids.ord) AS estado_horario_agrupado,pr1.filter1 AS filtrocapa "
					    + "   FROM  main.Channels u "
					    + "  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 = 'CHANNEL_TYPE') pr ON u.channeltypepar = CAST(pr.valor AS INTEGER) "
					    + "    LEFT JOIN ( SELECT elemento ->> 'dsc' AS descr,elemento ->> 'value' AS valor,elemento ->> 'filter' AS filter1 "
					    + "    FROM main.params p, "
					    + "           jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento " 
					    + "       WHERE p.paramname = 'EVALPROC_PERIOD') pr1 ON u.capacityperiod = CAST(pr1.valor AS INTEGER) "
				        + "	LEFT JOIN LATERAL (SELECT service_id,ord "
					    + " FROM UNNEST(CAST(string_to_array(u.serviceoffers, ',') AS INTEGER[])) WITH ORDINALITY AS t(service_id, ord)) AS service_ids ON TRUE "
					    + " LEFT JOIN main.serviceoffers s ON s.id = service_ids.service_id "
					    + " LEFT JOIN main.serviceoffers s_horario ON s_horario.id = service_ids.service_id ";
			}		
			Query query;
			String groupby = " GROUP BY u.id,u.name,u.status,u.dsc,u.amountop,u.volumeop,u.customerqty,u.capacity,u.capacityperiod,u.serviceoffers,u.channeltypepar,pr.descr,pr1.descr,pr1.filter1 ";
			
			String QueryTotal = "";
			String name = "u.name";
			String status = "u.status";				
			String lowername = "main.sinacentos(LOWER(u.name))";
			String lowerdsc = "main.sinacentos(LOWER(u.dsc))";
			String lowerdscParams = "main.sinacentos(LOWER(pr.descr))";
			String LowerSearch = searchIn.toLowerCase();
		//	String lowername = "main.sinacentos(LOWER(u.name))";
			
			 switch (searchIn) { 
			    case "":  // viene sin busqueda por el like
			    	//QueryTotal = SentenciaBase;
			    	//QueryTotal = SentenciaBase  + " WHERE " + lowername + " LIKE " + "'%" + "" + "%'";
			    	QueryTotal = SentenciaBase  + " WHERE TRUE = TRUE";
			     break;
			  
			    default:	// viene con el parametro para buscar por el like		
			    	   if (formatList==1) {
			         	QueryTotal = SentenciaBase + " WHERE (" + lowername + " LIKE  " + "'%" + LowerSearch + "%'"  + " OR " +  lowerdsc + " LIKE " + "'%" + LowerSearch + "%' " + " OR " + lowerdscParams + " LIKE " + "'%" + LowerSearch + "%')";
			    	   } else {
			    	   QueryTotal = SentenciaBase + " WHERE " + lowername + " LIKE  " + "'%" + LowerSearch + "%'";
			    	   }
			    	
	         }
			 
			 switch (searchStatus) { 
			    case 0:  // Busca por cualquier estatus
			    	QueryTotal = QueryTotal;
			     break;
			    case 1:  // Busca por estatus activo
			    	
			    	QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
			     break;
			    case 2:  // Busca por estatus Inactivo
			    	
			    	//QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
			    	QueryTotal = QueryTotal  + " AND " + 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("Error interno del servidor");
					estatus=HttpStatus.INTERNAL_SERVER_ERROR;   
					return new ResponseEntity(respuestaDto, estatus);
			    	
	         }
		 if (formatList==1) {
			    switch (typeIn) { 
			    case 0:  // Busca por cualquier estatus
			      	QueryTotal = QueryTotal;
			     break;
			    case 1:  // Busca por estatus activo
			    	
			    	QueryTotal = QueryTotal  + " AND " + " u.channeltypepar " + " = " + typeIn;
			     break;
			    case 2:  // Busca por estatus Inactivo
			    	
			    	//QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
			    	QueryTotal = QueryTotal  + " AND " + " u.channeltypepar " + " = " + typeIn;
			     break;
			     
                 case 3:  // Busca por estatus Inactivo
			    	
			    	//QueryTotal = QueryTotal  + " AND " + status + " = " + searchStatus;
			    	QueryTotal = QueryTotal  + " AND " +  " u.channeltypepar " + " = " + typeIn;
			     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);
			    	
	         }
		 }	    
			 
			    
			 if (formatList==1) {
			    	 QueryTotal = QueryTotal + groupby;
			         query = entityManager.createNativeQuery(QueryTotal);
			         cuantosregistro = (long) query.getResultList().size();			     			 			 			
			 
			 String ordena="";
			  if (orderIn == 1 || orderIn == 2 || orderIn == 3 || orderIn == 4 || orderIn == 99) {
				  ordena = " ASC";
			 }  else if (orderIn == -1 || orderIn == -2 || orderIn == -3 || orderIn == -4 || orderIn == -99) {
				  ordena = " DESC";
			 } else {
				 	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);
			 }		
			 int absolutoOrden = Math.abs(orderIn);			 			 			 			 
			 switch (absolutoOrden) { 
			    case 1:  //ordena por name ascendente
			    	
			    	QueryTotal = QueryTotal + " ORDER BY " + name + ordena;
			     break;
			    case 2://ordena por status ascendente
			    	
			    	QueryTotal = QueryTotal + " ORDER BY " + status + ordena;
			     break;	
                case 3:  //ordena por name ascendente
			    	
			    	QueryTotal = QueryTotal + " ORDER BY " + " u.dsc " + ordena;
			     break;
                case 4:  //ordena por name ascendente
 	
 	             QueryTotal = QueryTotal + " ORDER BY " + " u.channeltypepar " + ordena;
                 break;
                case 99:   //ordena por status ascendente
                	
                    QueryTotal = QueryTotal + " ORDER BY " + "u.id" + ordena;
                break; 
			 
			    
			   }
		}  else {
					     			 			 			
	 
	 String ordena="";
	  if (orderIn == 1 || orderIn == 2 || orderIn == 99) {
		  ordena = " ASC";
	 }  else if (orderIn == -1 || orderIn == -2 || orderIn == -99) {
		  ordena = " DESC";
	 } else {
		 	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);
	 }		
	 int absolutoOrden = Math.abs(orderIn);			 			 			 			 
	 switch (absolutoOrden) { 
	    case 1:  //ordena por name ascendente
	    	
	    	QueryTotal = QueryTotal + " ORDER BY " + name + ordena;
	     break;
	    case 2://ordena por status ascendente
	    	
	    	QueryTotal = QueryTotal + " ORDER BY " + status + ordena;
	     break;	
        case 99:   //ordena por status ascendente
        	
            QueryTotal = QueryTotal + " ORDER BY " + "u.id" + ordena;
        break; 
	 
	    
	   }
	}
			 if (formatList!=2) {  
			 //Se mapea la entidad se le pasa el query y lo bota como un tipo de objeto ParamDto-Buscar en los DTO 
			  //   TypedQuery<ChannelsDtoStatus> channels= entityManager.createQuery(QueryTotal, ChannelsDtoStatus.class);
			   //  channels.setFirstResult(offsetIn);
			    // channels.setMaxResults(numofrecordsIn);
			     
			     
			   
				       query = entityManager.createNativeQuery(QueryTotal);
				       query.setFirstResult(offsetIn);
					   query.setMaxResults(numofrecordsIn);
					   List<Object[]> listacompleta = query.getResultList();
				
			      
			      //List<ChannelsDtoStatus> listacompleta = channels.getResultList();
			   
		    	   List<CampaignFormat2Dto> listasSuppliers = new ArrayList<>();
		    	   detalleSuppliers = new CampaignFormat2Dto();
		    	   //Se de be hacer el ciclo para poder llenar el objeto de la descripcion del estatus
		    	  //
		    	   //for(ChannelsDtoStatus suppliers : listacompleta) {
		    	//   ServiceOffersDescDto detalleserviceoffers;
		    	  // List<ServiceOffersDescDto> listasOfertas= new ArrayList<>();
		   	///	List<ServiceOffersDescDto> listasOfertas = new ArrayList<>();
		    		 for (Object[] reg : listacompleta) {	   
		    		   detalleSuppliers = new CampaignFormat2Dto();
		    		   channelsRecordDto = new ChannelsRecordDto();
		    		  //detalleUnits.setId((int) reg[0]);	
		    		   detalleStatus = new StatusDto2();
		    		   detalleType = new StatusDto2();
		    		   detalleAmountOP = new ChannelsAmountDto();
		    		   detallevolumeOP = new ChannelsAmountDto();
		    		   detallecapacityperiod = new StatusDto2();
		    		   detalleserviceoffers = new ServiceOffersDescDto();
		    		   
		    		   channelsRecordDto.setId((int) reg[0]);
		    		   channelsRecordDto.setName((String) reg[1]);	
		    		   channelsRecordDto.setDsc((String) reg[4]);
		    		   
		    		   
		    		   channelsRecordDto.setCustomerQty((int) reg[7]);
		    		  // channelsRecordDto.setCapacity((int) reg[8]);
		    		   channelsRecordDto.setCapacity((int) reg[8] / Integer.parseInt((String) reg[16]));
		    		  // detalleAtttime.setQty((Integer) reg[22] / Integer.parseInt((String) reg[37]));
		    		   
		    		   // seteo el estatus		    		   			    	   
			    	   detalleStatus.setId((int) reg[2]);
			    	   detalleStatus.setName((String) reg[3]);			    	   			    	   				 
			    	   channelsRecordDto.setStatus(detalleStatus);
			    	   // termino de setear el estatus
			    	   
			    	   // seteando el type
			    	    
			    	   int idestatus  = Integer.parseInt((String) reg[11]);
			    	   if (idestatus==0) {
			    		     detalleType.setId(0);
				    	     detalleType.setName("");
				    	     channelsRecordDto.setType(detalleType);
		    		   } else {
		    			     
				    	     detalleType.setId(idestatus);
				    	     detalleType.setName((String) reg[12]);
				    	     channelsRecordDto.setType(detalleType);
		    		   }  
			    	   // fin de seteando el type
			    	     
			    	   // seteando el detallecapacityperiod
			    	  int idestatuscapacity = 0;
			    	   try {
			    		    idestatuscapacity  = (int) reg[9];
			    	   } catch (Exception e) {
			    	        idestatuscapacity  = 0;
			    	   }
			    	   if (idestatuscapacity==0) {
			    		     detallecapacityperiod.setId(0);
				    	     detallecapacityperiod.setName("");
				    	     channelsRecordDto.setCapacityperiod(detallecapacityperiod);
			    	   } else {
			    	     detallecapacityperiod.setId((int) reg[9]);
			    	     detallecapacityperiod.setName((String) reg[14]);
			    	     channelsRecordDto.setCapacityperiod(detallecapacityperiod);
			    	   } 
			    	    // fin del seteando  detallecapacityperiod
			    	     
			    	    //seteando las ofertas de servicio asociada
			    	     
			    	       String Idoffers = (String) reg[10]; // AQUI VIENEN LOS ID DE LAS OFERTAS ASOCIADAS
			    		   String Nameoffers = (String) reg[13]; // AQUI VIENEN LOS NOMBRES DE LAS  OFERTAS ASOCIADAS
			    		   String Tipooffers = (String) reg[15]; // AQUI VIENEN LOS TIPOS DE OFERTAS ASOCIADAS, INDICATIVO DE SI SON 24X7
			    		   
			    		   
			    		   if (Idoffers != null && !Idoffers.isEmpty()) {
						    	
						        String[] IdOffers = Idoffers.split(",");
						        String[] NameOffers = Nameoffers.split(",");
						        String[] TypeOffers = Tipooffers.split(",");
						        int i = 0;
						       // listasUnits = new ArrayList<>();
						        listasOfertas = new ArrayList<>();
						        for (String ofeId : IdOffers) {
						        	detalleserviceoffers = new ServiceOffersDescDto();
						        //	can.add(Integer.parseInt(uniId));
						        	String NombreOf = NameOffers[i];
						        	String TipoOf = TypeOffers[i];
						        	 TipoOf = TipoOf.replace(" ", "");
						        	
						        	  detalleserviceoffers.setId(Integer.parseInt(ofeId));
					    	          detalleserviceoffers.setName(NombreOf);
					    	          boolean estatustype;
					    	        //  if (TipoOf==="SI")  {
					    	          if (TipoOf.equals("SI")) { 
					    	        	  estatustype = true;
					    	          } else {
					    	        	  estatustype = false;
					    	          }
					    	          //detalleserviceoffers.setO24x7(estatustype);
					    	          detalleserviceoffers.setOffer_full(estatustype);
						        	 /* detalleUnits.setId(Integer.parseInt(uniId));
							    	  detalleUnits.setName(Nombreuni);*/
							    	  
							    	  listasOfertas.add(detalleserviceoffers);
							    	  //listasOfertas
						        	i = i+1;
						        }
						    }  else {
						    	//System.out.print(IdUniString);
						    	//detalleUnits = new UnitsUsersDto();
						    	detalleserviceoffers = new ServiceOffersDescDto();
						    	
						    	//  detalleUnits.setId(0);
						    	 // detalleUnits.setName(null);
						    	  //listasUnits.add(detalleUnits);
						    }		
			    		   
			    	         			     
			    		   channelsRecordDto.setServiceoffers(listasOfertas);
			    		 // fin del metodo para setear las ofertas que vienen separadas por coma en el resultset  
			    		   //detalleAmountOP = new ChannelsAmountDto();
			    		   
			    		 //  detallevolumeOP = new ChannelsAmountDto();
			    		   
			    		   DecimalFormat df1 = new DecimalFormat("#,##0.00");
			    	      //  System.out.println("Formato fijo 2 decimales: " + df1.format(monto));
			    	        String formatoStringmonto = df1.format((BigDecimal) reg[5]);
			    	       // double valorDouble = formatoStringmonto.doubleValue();
			    	        String formatoStringvolumen = df1.format((BigDecimal) reg[6]);
			    	        BigDecimal montouno = (BigDecimal) reg[5];
			    	        BigDecimal montodos = (BigDecimal) reg[6];
			    	        String monto1 = montouno.toString();
			    	        String monto2  = montodos.toString();	
			    	        
			    		   detalleAmountOP.setFormatted(formatoStringmonto);
			    		   
			    		   detalleAmountOP.setNumber((BigDecimal) reg[5]);
			    		   
			    		   detallevolumeOP.setFormatted(formatoStringvolumen);
			    		   detallevolumeOP.setNumber((BigDecimal) reg[6]);
			    		   
			    		   
			    		   channelsRecordDto.setAmountOP(detalleAmountOP);
			    		   channelsRecordDto.setVolumeOP(detallevolumeOP);
			    		   listasRecord.add(channelsRecordDto);
		    	   }
		    	
		    	   
      	    	 	detallePrivilege = new PrivilegesAllDto();
      	    	       boolean tieneView = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,220);
					   boolean tieneUpdate = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,221);
					   boolean tieneAdd = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,222);
					   boolean tieneDelete = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol,223);
					   //existsByRolidAndPrivilegeid
					   
	      	    	 	detallePrivilege.setView(tieneView);
			    	  	detallePrivilege.setUpdate(tieneUpdate);		    	  
			    	  	detallePrivilege.setAdd(tieneAdd);
			    	  	detallePrivilege.setDelete(tieneDelete);
			    	  	
			    	  	
			    	  	 String SetenciaTypes="";
							
					      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 = 'CHANNEL_TYPE' ORDER BY valor ASC";
					      
					      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);
					       }
		    	          
					       String SetenciaPeriodos="";
							
					       SetenciaPeriodos= "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 = 'EVALPROC_PERIOD' ORDER BY valor ASC";
						      
						      Query queryPeriodo = entityManager.createNativeQuery(SetenciaPeriodos);
						       List<Object[]> listaperiodos= queryPeriodo.getResultList();
						       for (Object[] typesperi : listaperiodos) {
						    	   detallePeriodos = new TypesUnitDto();
						    	  
						    	   detallePeriodos.setDsc((String) typesperi[0]);
						    	   detallePeriodos.setValue((String) typesperi[1]);
						    	   listasPeriodos.add(detallePeriodos);
						       }
		    	
					        // TypesUnitDto detallePeriodos;
						    // List<TypesUnitDto> listasPeriodos = new ArrayList<>();
							 
		    	  	channelsResponseDto.setNumofrecords(cuantosregistro);
		           //paramsResponseDto.setValidthru(ValidThrufechaSalida);
		    	  	channelsResponseDto.setSessionvalidthru(fechaComoCadena);		           
		    	  	channelsResponseDto.setRecords(listasRecord);
		    	  	channelsResponseDto.setTypes(listasTypes);
		    	  	channelsResponseDto.setPeriods(listasPeriodos);
		    	  	channelsResponseDto.setPrivileges(detallePrivilege);		      		   			
		  						           
                return ResponseEntity.ok(channelsResponseDto);
		     						
			 } else {
				 
				 TypedQuery<ChannelsDtoStatus> suppliers= entityManager.createQuery(QueryTotal, ChannelsDtoStatus.class);
				  List<ChannelsDtoStatus> listacompleta = suppliers.getResultList();
				  List<CampaignFormat2Dto> listasSuppliers2 = new ArrayList<>();
				  
				
				  
				  for(ChannelsDtoStatus suppli : listacompleta) {
		    		   detalleCompaing2 = new CampaignFormat2Dto();
		    		 
		    		   detalleStatus2 = new StatusDto();
		    		   detalleCompaing2.setId(suppli.getId());
		    		   detalleCompaing2.setName(suppli.getName());
		    		  
		    		   
			    	  // detalleStatus.setId(suppli.getStatus());
			    	  /// detalleStatus.setName(suppli.getEstatus());
				     
		    		   detalleStatus2.setId(suppli.getStatus());
			    	   detalleStatus2.setName(suppli.getEstatus());
				     
			    	   detalleCompaing2.setStatus(detalleStatus2);
			    	  // detalleSuppliers.setStatus(detalleStatus);
			    	   
			    	   listasSuppliers2.add(detalleCompaing2);
		    	   }
				  
				       
				          channelsFormatResponseDto.setSessionvalidthru(fechaComoCadena);		           
				          channelsFormatResponseDto.setRecords(listasSuppliers2);
			  						           
	                return ResponseEntity.ok(channelsFormatResponseDto);

			 }  
       
		}catch (Exception e) {
            // Manejo de excepciones
			respuesta= new RespuestaDto("Error interno del servidor", false);
			estatus=HttpStatus.INTERNAL_SERVER_ERROR;            
        } finally {
	        if (entityManager != null && entityManager.isOpen()) {
	            entityManager.close();
	        }
	    }
		
		return new ResponseEntity(respuesta, estatus);
	
	}
	
//	@GetMapping("/vicepresidencies/{vicepresidencyid}")
//	public ResponseEntity<?> getOneVP(HttpServletRequest request, @PathVariable("vicepresidencyid") final Integer vicepresidencyid)
	//		throws ParseException {
	
	@GetMapping("/channels/{channelid}")
	public ResponseEntity<?> getOneVP(HttpServletRequest request, @PathVariable("channelid") final Integer channelid) throws ParseException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		ChannelEntryResponseDto channelEntryResponseDto = new ChannelEntryResponseDto();
		ChannelsEntryDto channelsRecordDto = new ChannelsEntryDto();
		RecordCatalogoResponseDto channelsFormatResponseDto = new RecordCatalogoResponseDto();
		CampaignFormat2Dto detalleCompaing2;
		int formatList = 0;
	//	ParamsDto detalleParams;
		CampaignFormat2Dto detalleSuppliers;
		StatusDto2 detalleStatus;
		StatusDto2 detalleType;
		StatusDto detalleStatus2;
		ChannelsAmountDto detalleAmountOP;
		ChannelsAmountDto detallevolumeOP;
		StatusDto2 detallecapacityperiod;
		TypesUnitDto detalleTypes;
		ServiceOffersDescDto detalleserviceoffers;
		List<ServiceOffersDescDto> listasOfertas = new ArrayList<>();
		PrivilegesAllDto detallePrivilege;
		List<TypesUnitDto> listasTypes = new ArrayList<>();
	     
	     Long cuantosregistro = (long) 0;
	     
	     List<PrivilegesAllDto> listasPrivelege = new ArrayList<>();
	     List<ChannelsRecordDto> listasRecord= 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 idrol;
	   	  String searchIn = "";
	   	  String contentIn = "";
	     // String searchModule = "";
		  int searchStatus = 0;
		  int typeIn=0;
		  String fechaComoCadena; 
		 int orderIn = 0;
		 int offsetIn = 0;
		 int numofrecordsIn = 0;
		 Date fecha2 = new Date();
		 
			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);
				   Optional<Users> encontreSessionUsuario =usersRepository.getBySessionid(sessionid);
				//   String usuarioIN = encontreSessionUsuario.get().getUsr();
				 //  int position = usuarioIN.indexOf('('); 
				   
				   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);
						   
					    }
					   
					  // Este proceso permite obtener un listado de los proveedores. (Priv 440)
					   Roles roles = encontreSessionUsuario.get().getRolid();
					   idrol = roles.getId();
					   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 220);
					   if (formatList!=2) {
					        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 = tiposfiltros.getFilters().getSearch();
						
						
						  
						  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);
				 }
			}
			
			
		
		try {
			
			String SentenciaBase;
			
			
		    	// SentenciaBase = "SELECT new com.dacrt.SBIABackend.dto.ChannelsDtoStatus (u.id,u.name,u.status,CASE WHEN u.status = 1 then 'Activo' ELSE 'Inactivo' END AS estatus) FROM Channels u";
				
				SentenciaBase = " SELECT u.id,u.name,u.status,CASE WHEN u.status = 1 THEN 'Activo' ELSE 'Inactivo' END AS estatus,u.dsc, "
					    + " u.amountop,u.volumeop ,CAST(u.customerqty AS INTEGER) AS customerqty ,CAST(u.capacity AS INTEGER) AS capacity ,"
					    + " CAST(u.capacityperiod AS INTEGER) AS capacityperiod,u.serviceoffers, "
					    + " CAST(u.channeltypepar AS TEXT) AS channeltypepar,pr.descr, "
					    + " STRING_AGG(s.name, ', ' ORDER BY service_ids.ord) AS nombres_ofertas_servicio_agrupados,pr1.descr AS desccapacity,"
					    + " STRING_AGG(CASE WHEN s_horario.offer_full = 1 THEN 'SI' ELSE 'NO' END, ', ' ORDER BY service_ids.ord) AS estado_horario_agrupado,pr1.filter1 AS filtrocapa "
					    + "   FROM  main.Channels u "
					    + "  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 = 'CHANNEL_TYPE') pr ON u.channeltypepar = CAST(pr.valor AS INTEGER) "
					    + "    LEFT JOIN ( SELECT elemento ->> 'dsc' AS descr,elemento ->> 'value' AS valor,elemento ->> 'filter' AS filter1 "
					    + "    FROM main.params p, "
					    + "           jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento " 
					    + "       WHERE p.paramname = 'EVALPROC_PERIOD') pr1 ON u.capacityperiod = CAST(pr1.valor AS INTEGER) "
				        + "	LEFT JOIN LATERAL (SELECT service_id,ord "
					    + " FROM UNNEST(CAST(string_to_array(u.serviceoffers, ',') AS INTEGER[])) WITH ORDINALITY AS t(service_id, ord)) AS service_ids ON TRUE "
					    + " LEFT JOIN main.serviceoffers s ON s.id = service_ids.service_id "
					    + " LEFT JOIN main.serviceoffers s_horario ON s_horario.id = service_ids.service_id "
					    + " WHERE u.id = "  + channelid;
					
			Query query;
			String groupby = " GROUP BY u.id,u.name,u.status,u.dsc,u.amountop,u.volumeop,u.customerqty,u.capacity,u.capacityperiod,u.serviceoffers,u.channeltypepar,pr.descr,pr1.descr,pr1.filter1 ";
			
			String QueryTotal = "";
			
			    
			    	   QueryTotal = SentenciaBase + groupby;			   
				       query = entityManager.createNativeQuery(QueryTotal);
					   List<Object[]> listacompleta = query.getResultList();
				
			      
			      //List<ChannelsDtoStatus> listacompleta = channels.getResultList();
			   
		    	   List<CampaignFormat2Dto> listasSuppliers = new ArrayList<>();
		    	   detalleSuppliers = new CampaignFormat2Dto();
		    	
		    		 for (Object[] reg : listacompleta) {	   
		    		   detalleSuppliers = new CampaignFormat2Dto();
		    		   channelsRecordDto = new ChannelsEntryDto();
		    		  //detalleUnits.setId((int) reg[0]);	
		    		   detalleStatus = new StatusDto2();
		    		   detalleType = new StatusDto2();
		    		   detalleAmountOP = new ChannelsAmountDto();
		    		   detallevolumeOP = new ChannelsAmountDto();
		    		   detallecapacityperiod = new StatusDto2();
		    		   detalleserviceoffers = new ServiceOffersDescDto();
		    		   
		    		   channelsRecordDto.setId((int) reg[0]);
		    		   channelsRecordDto.setName((String) reg[1]);	
		    		   channelsRecordDto.setDsc((String) reg[4]);
		    		   
		    		   
		    		   channelsRecordDto.setCustomerQty((int) reg[7]);
		    		   //channelsRecordDto.setCapacity((int) reg[8]);
		    		   channelsRecordDto.setCapacity((int) reg[8] / Integer.parseInt((String) reg[16]));
		    		   // seteo el estatus		    		   			    	   
			    	   detalleStatus.setId((int) reg[2]);
			    	   detalleStatus.setName((String) reg[3]);			    	   			    	   				 
			    	   channelsRecordDto.setStatus(detalleStatus);
			    	   // termino de setear el estatus
			    	   
			    	   // seteando el type
			    	    
			    	   int idestatus  = Integer.parseInt((String) reg[11]);
			    	   if (idestatus==0) {
			    		     detalleType.setId(0);
				    	     detalleType.setName("");
				    	     channelsRecordDto.setType(detalleType);
		    		   } else {
		    			     
				    	     detalleType.setId(idestatus);
				    	     detalleType.setName((String) reg[12]);
				    	     channelsRecordDto.setType(detalleType);
		    		   }  
			    	   // fin de seteando el type
			    	     
			    	   // seteando el detallecapacityperiod
			    	   int idestatuscapacity  = (int) reg[9];
			    	   
			    	   if (idestatuscapacity==0) {
			    		     detallecapacityperiod.setId(0);
				    	     detallecapacityperiod.setName("");
				    	     channelsRecordDto.setCapacityperiod(detallecapacityperiod);
			    	   } else {
			    	     detallecapacityperiod.setId((int) reg[9]);
			    	     detallecapacityperiod.setName((String) reg[14]);
			    	     channelsRecordDto.setCapacityperiod(detallecapacityperiod);
			    	   } 
			    	    // fin del seteando  detallecapacityperiod
			    	     
			    	    //seteando las ofertas de servicio asociada
			    	     
			    	       String Idoffers = (String) reg[10]; // AQUI VIENEN LOS ID DE LAS OFERTAS ASOCIADAS
			    		   String Nameoffers = (String) reg[13]; // AQUI VIENEN LOS NOMBRES DE LAS  OFERTAS ASOCIADAS
			    		   String Tipooffers = (String) reg[15]; // AQUI VIENEN LOS TIPOS DE OFERTAS ASOCIADAS, INDICATIVO DE SI SON 24X7
			    		   
			    		   
			    		   if (Idoffers != null && !Idoffers.isEmpty()) {
						    	
						        String[] IdOffers = Idoffers.split(",");
						        String[] NameOffers = Nameoffers.split(",");
						        String[] TypeOffers = Tipooffers.split(",");
						        
						        int i = 0;
						       // listasUnits = new ArrayList<>();
						        listasOfertas = new ArrayList<>();
						        for (String ofeId : IdOffers) {
						        	detalleserviceoffers = new ServiceOffersDescDto();
						        //	can.add(Integer.parseInt(uniId));
						        	String NombreOf = NameOffers[i];
						        	String TipoOf = TypeOffers[i];
						        	 TipoOf = TipoOf.replace(" ", "");
						        	
						        	  detalleserviceoffers.setId(Integer.parseInt(ofeId));
					    	          detalleserviceoffers.setName(NombreOf);
					    	          boolean estatustype;
					    	        //  if (TipoOf==="SI")  {
					    	          if (TipoOf.equals("SI")) { 
					    	        	  estatustype = true;
					    	          } else {
					    	        	  estatustype = false;
					    	          }
					    	       //   detalleserviceoffers.setO24x7(estatustype);
					    	          detalleserviceoffers.setOffer_full(estatustype);
							    	  listasOfertas.add(detalleserviceoffers);
							    	  //listasOfertas
						        	i = i+1;
						        }
						    }  else {
						    
						    	detalleserviceoffers = new ServiceOffersDescDto();
						    	
						    }		
			    		   
			    	         			     
			    		   channelsRecordDto.setServiceoffers(listasOfertas);
			    		 // fin del metodo para setear las ofertas que vienen separadas por coma en el resultset  
			    		   //detalleAmountOP = new ChannelsAmountDto();
			    		   
			    		 //  detallevolumeOP = new ChannelsAmountDto();
			    		   
			    		   DecimalFormat df1 = new DecimalFormat("#,##0.00");
			    	      //  System.out.println("Formato fijo 2 decimales: " + df1.format(monto));
			    	        String formatoStringmonto = df1.format((BigDecimal) reg[5]);
			    	       // double valorDouble = formatoStringmonto.doubleValue();
			    	        String formatoStringvolumen = df1.format((BigDecimal) reg[6]);
			    	        BigDecimal montouno = (BigDecimal) reg[5];
			    	        BigDecimal montodos = (BigDecimal) reg[6];
			    	        String monto1 = montouno.toString();
			    	        String monto2  = montodos.toString();	
			    	        
			    		   detalleAmountOP.setFormatted(formatoStringmonto);
			    		   
			    		   detalleAmountOP.setNumber((BigDecimal) reg[5]);
			    		   
			    		   detallevolumeOP.setFormatted(formatoStringvolumen);
			    		   detallevolumeOP.setNumber((BigDecimal) reg[6]);
			    		   
			    		   
			    		   channelsRecordDto.setAmountOP(detalleAmountOP);
			    		   channelsRecordDto.setVolumeOP(detallevolumeOP);
			    		   //listasRecord.add(channelsRecordDto);
		    	   }
		    	
		    	   	  	
		    		 String SetenciaTypes="";
						
						 
						      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 = 'EVALPROC_PERIOD' ORDER BY valor ASC";
						      
						      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);
						       }
					
		    	
		           //paramsResponseDto.setValidthru(ValidThrufechaSalida);
						       channelEntryResponseDto.setPeriods(listasTypes);	           
						       channelEntryResponseDto.setEntry(channelsRecordDto);
		  						           
                return ResponseEntity.ok(channelEntryResponseDto);
		     						
			 
       
		}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("/channels/{channelid}")
	public ResponseEntity<ParamsResponseDto> ChannelsUpdate(HttpServletRequest request,@RequestBody ChannelsRequestDto datoschannels,@PathVariable("channelid") final Integer channelid) throws ParseException {
			//@GetMapping("/vicepresidencies/{vicepresidencyid}")
			
			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<>();
		     
			 int idparametro = channelid;
			 
			 int valor = idparametro;
			 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();
		        Optional<Users> encontreSessionUsuario;    	       	  		
			   Date fecha2 = new Date();
			   Calendar calendar = Calendar.getInstance();
		
			 
				if (sessionid==null) {
					String var = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
					//respuestaDto.setBlocked(bloked);
					respuestaDto.setMsg("Llamada al servicio malformado");
					//Error 400
					return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
				} else   {
					 
					   sessionid = sessionid.substring(7);
					   encontreSessionUsuario =usersRepository.getBySessionid(sessionid);
				       String fechaComoCadena;
					   
					   if (encontreSessionUsuario.isPresent()) {
						   
						   Date FechaReg = encontreSessionUsuario.get().getValidthru(); 
	  					   //Llamada a la funcion que validad el tiempo de Session, retorna la fecha sumandole el tiempo de session activa, y vacio si no esta activa
	  					   
	  					  //  fechaComoCadena  = securityService.consultarSessionActiva(FechaReg,fecha2);
	  					   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);
	  						   
	  					    }
	  					    
	  					  String Salida = usersService.verificarCaracteresValidosConRegex(datoschannels.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);
	  					  }
	  					  
	  	                 String SalidaDsc = usersService.verificarCaracteresValidosConRegex(datoschannels.getDsc());
	  					  
	  					  if (SalidaDsc=="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);
	  					  }
	  					  
	  					   
						 //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, 222);
							  // 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 {
						   
						   Roles roles = encontreSessionUsuario.get().getRolid();
						   int idrol = roles.getId();
						   int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 221);
						 //  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);
							   
						     }
						   
                               boolean existeCanal = channelsRepository.existsById(channelid);
						   
						      if  (!existeCanal) {	
							   
							  
							    
							    	String var = "";
							    	RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
									//respuestaDto.setBlocked(bloked);
									respuestaDto.setMsg("Registro No encontrado");
									//Error 400
									return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
							    
						       }
						   } 
						   						                        						 							
						   
						 if (idparametro==0) {
							   
	                       if  (datoschannels.getName()!= "" ) {	
								   
								   //boolean existeRef = unitsRepository.existsByRef(datosUnidad.getRef());
								   String Query1 = "SELECT name FROM main.channels WHERE LOWER(name) = " + "'" + datoschannels.getName().toString().toLowerCase() + "'" ;
								   Long cuantosregistroref = (long) jdbcTemplate.queryForList(Query1).size();
								   
								    if (cuantosregistroref>0) {
								    	String var = "";
								    	RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
										//respuestaDto.setBlocked(bloked);
										respuestaDto.setMsg("Registro Duplicado");
										//Error 400
										return new ResponseEntity(respuestaDto, HttpStatus.CONFLICT);
								    }
							   }	                       	                     				                     						   											
							   
						   }
							   
						       
				
					   
					 } 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 {
				
				
				//Vicepresidencies tipovp2=null;
				Channels tipoCanal2=null;
				//Vicepresidencies tipovp=null;
				Channels tipoCanal=null;
				//Vicepresidencies tipovpNew2=null;
				Channels tipoCanalNew2=null;
				//Optional<Vicepresidencies> nuevoinsertado = null;
				Optional<Channels> nuevoinsertado = null;
               
				
				if (idparametro==0) {
					
					//Vicepresidencies tipovpNew = new Vicepresidencies();
					Channels tipoCanalNew = new Channels();
					
					//String capacityperiod = datoschannels.getCapacityperiod().toString();
					
					 int cantidadAlmacenarCapacity = paramsService.converttoMinute(datoschannels.getCapacityperiod().toString(),datoschannels.getCapacityqty());
		                
		                if (cantidadAlmacenarCapacity==0) {
		                	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);
		                }
		                
					
					//Workers
					//datosWorker
					tipoCanalNew.setStatus(datoschannels.getStatus());
					tipoCanalNew.setModifiedat(fechaDate);
					tipoCanalNew.setCreatedat(fechaDate); 
					tipoCanalNew.setName(datoschannels.getName());
					tipoCanalNew.setDsc(datoschannels.getDsc());
					// typeIn  = Integer.parseInt(typeIn2);
					if (datoschannels.getChanneltypepar()==""){
						tipoCanalNew.setChanneltypepar(0);
					} else {
						tipoCanalNew.setChanneltypepar(Integer.parseInt(datoschannels.getChanneltypepar()));
					}
					
				
					   int cuantosprocesos = datoschannels.getServiceoffers().size();
					   String OfertassinCorchetes2 = "";
						if (cuantosprocesos > 0 ) {
						   String procesos = arrayAParentesis(datoschannels.getServiceoffers());	
						   String OfertassinCorchetes = procesos.replace("(", "")
				                             .replace(")", "");
						    OfertassinCorchetes2 = OfertassinCorchetes; 
						    OfertassinCorchetes2 = OfertassinCorchetes2.replace(" ", "");
				      	
						     String cadena1 = OfertassinCorchetes2;
				             String cadena2 = "No hay negativos aquí.";
				             String valorBuscado = "-1"; // ¡Aquí está la clave! Es un String, no un char.

				             // --- Opción 1: Usando String.contains() (recomendado por su legibilidad) ---
				             if (cadena1.contains(valorBuscado)) {
				                // System.out.println("Cadena 1: El valor '" + valorBuscado + "' SÍ está presente.");
				            	 OfertassinCorchetes2 = "-1";
				            	 tipoCanalNew.setServiceoffers(OfertassinCorchetes2);
				             } else {
				                // System.out.println("Cadena 1: El valor '" + valorBuscado + "' NO está presente.");
				            	 tipoCanalNew.setServiceoffers(OfertassinCorchetes2);
				             } 
				        
					      }
					//tipoCanalNew.setServiceoffers(OfertassinCorchetes2);
					tipoCanalNew.setCustomerqty(datoschannels.getCustomerqty());
					
					//tipoCanalNew.setCapacity(datoschannels.getCapacityqty()); 
					tipoCanalNew.setCapacity(cantidadAlmacenarCapacity); 
					tipoCanalNew.setCapacityperiod(datoschannels.getCapacityperiod());
					
					
					tipoCanalNew.setAmountop(datoschannels.getAmountop());
					tipoCanalNew.setVolumeop(datoschannels.getVolumeop());
				
			         
					tipoCanalNew2=channelsService.addIdChannels(tipoCanalNew);
					tipoCanal2 = tipoCanalNew2;
			        nuevoinsertado = channelsRepository.findByName(datoschannels.getName());
					int idInsertado =  nuevoinsertado.get().getId();
					int idmensaje = idInsertado;

				    //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
				     String module = "Canales";
				     //String Descmodule = "Actualización de parametro del Sistema con id: " + parmid  ;
				     String Descmodule = "Se agregó el Canal: " + datoschannels.getName() + " 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(idmensaje);
						estatus=HttpStatus.OK;
						return new ResponseEntity(respuestaValueDto, estatus); 
		         

				} else {
					
					 int cantidadAlmacenarCapacity = paramsService.converttoMinute(datoschannels.getCapacityperiod().toString(),datoschannels.getCapacityqty());
		                
		                if (cantidadAlmacenarCapacity==0) {
		                	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);
		                }
		                
					
				    	tipoCanal = channelsService.getChannelsByid(idparametro);
				    	
				    	int tieneofeer247 = channelsRepository.validChanneloferr247(idparametro);
					 
				    	
				    	tipoCanal.setStatus(datoschannels.getStatus());
				    	tipoCanal.setDsc(datoschannels.getDsc());
				    	tipoCanal.setChanneltypepar(Integer.parseInt(datoschannels.getChanneltypepar()));
				    	tipoCanal.setModifiedat(fechaDate);	
				    	  int cuantosprocesos = datoschannels.getServiceoffers().size();
						   String OfertassinCorchetes2 = "";
							if (cuantosprocesos > 0 ) {
							   String procesos = arrayAParentesis(datoschannels.getServiceoffers());	
							   String OfertassinCorchetes = procesos.replace("(", "")
					                             .replace(")", "");
							    OfertassinCorchetes2 = OfertassinCorchetes; 
							    OfertassinCorchetes2 = OfertassinCorchetes2.replace(" ", "");
					        			
							         if (tieneofeer247==0) {
							        	 String cadena1 = OfertassinCorchetes2;
							             String cadena2 = "No hay negativos aquí.";
							             String valorBuscado = "-1"; // ¡Aquí está la clave! Es un String, no un char.

							             // --- Opción 1: Usando String.contains() (recomendado por su legibilidad) ---
							             if (cadena1.contains(valorBuscado)) {
							                // System.out.println("Cadena 1: El valor '" + valorBuscado + "' SÍ está presente.");
							            	 OfertassinCorchetes2 = "-1";
							            	 tipoCanal.setServiceoffers(OfertassinCorchetes2);
							             } else {
							                // System.out.println("Cadena 1: El valor '" + valorBuscado + "' NO está presente.");
							            	 tipoCanal.setServiceoffers(OfertassinCorchetes2);
							             }
								 	      
								       } 
						      }
								
				    	
				    	tipoCanal.setCustomerqty(datoschannels.getCustomerqty());
						tipoCanal.setCapacity(cantidadAlmacenarCapacity);
						tipoCanal.setCapacityperiod(datoschannels.getCapacityperiod());
						tipoCanal.setAmountop(datoschannels.getAmountop());
						tipoCanal.setVolumeop(datoschannels.getVolumeop());

						String vp1 = tipoCanal.getName();
						String vp2 = datoschannels.getName();
						if (vp1.equals(vp2)){
							String Validausers = "El canal es el mismo";
					    	
						} else {
					
						 String QueryTotal = "SELECT name FROM main.channels WHERE LOWER(name) = " + "'" + datoschannels.getName().toString().toLowerCase() + "'" ;
						 Long validaCanal = (long) jdbcTemplate.queryForList(QueryTotal).size();
						 
		                if (validaCanal>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 {
							tipoCanal.setName(datoschannels.getName());
						}
					}																
					
														
			          
						//tipovp2=workersService.addIdWorkers(tipoWorker);
						tipoCanal2=channelsService.addIdChannels(tipoCanal);
						
					    //////////////////////////INSERCION BLOQUE DE AUDITORIA///////////////////
					     String module = "Canales";
					     //String Descmodule = "Actualización de parametro del Sistema con id: " + parmid  ;
					     String Descmodule = "Se actualizó el Canal: "+ datoschannels.getName() + " con Id:" + channelid ;
					    
				         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///////////////////	
				 		   int idmensaje = channelid;
				 		   respuestaValueDto= new RespuestaValueDto(idmensaje);
							estatus=HttpStatus.OK;
							return new ResponseEntity(respuestaValueDto, estatus); 
			         
			      
				      }
			
			} catch (Exception e) {
	            // Manejo de excepciones
				respuesta= new RespuestaMsgDto("Error interno del servidor");
				estatus=HttpStatus.INTERNAL_SERVER_ERROR;            
	        } finally {
				if (entityManager != null && entityManager.isOpen()) {
					entityManager.close();
				}
			}
			
			return new ResponseEntity(respuesta, estatus);
		
		}
	
	
	@DeleteMapping("/channels/{channelid}")
	public ResponseEntity<?> borrarChannels(HttpServletRequest request, @PathVariable("channelid") final Integer channelid)
			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, minutosASumar); //minutosASumar es int.
		calendar.add(Calendar.MINUTE, duracionSession); // horasASumar es int.
		// lo que más quieras sumar
		Date ValidThrufechaSalida = calendar.getTime(); // Y ya tienes la fecha sumada.

		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);
					    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, 223);
				   //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 (channelsRepository.existsById(channelid)) {
						
						  Optional<Channels> CanalDelete = channelsRepository.findById(channelid);
						   String module = "Canales";
						     String Descmodule = "Se eliminó el Canal: " + CanalDelete.get().getName() + " con Id: " + CanalDelete.get().getId();
						    
					         auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());
					       
					         String singo1 = "(";
					         String singo2 = ")";
					         String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1).concat(encontreSessionUsuario.get().getEmail().concat(singo2));
					         auditDto.setUserref(usryemail);
					         auditDto.setModule(module);
					         auditDto.setDesc(Descmodule);
					         auditDto.setCreatedat(fechaDate);
					 		   usersService.registrarAuditSesion(auditDto); 
						
						// Borro el rol boolean existeUsers = ;
						int valor = 0;
						try {
						//usersRepository.deleteusersbyid(userid,fechaDate,valor);	
							channelsRepository.deleteChannelsbyid(channelid);	
						    respuestaValueDto= new RespuestaValueDto(channelid);
						    
						    Connection conexion2 = DriverManager.getConnection(conexion,userbd, passbd);
						    Statement sentenciaPreparadaUpd = null;
							sentenciaPreparadaUpd= conexion2.createStatement();
						    String sqlUpd = " UPDATE main.applications set channelids = TRIM(BOTH ',' FROM REGEXP_REPLACE(channelids, '(^|,)" + channelid + "(,|$)', '\\1\\2', 'g'))" 
							+ " WHERE channelids LIKE '%" +  channelid + "%'" + " and channelids is not null";
	    	                //UPDATE main.unitprocesses set deleted = '2025-01-01' where unitid = 2 and processid = 111
            	    	    sentenciaPreparadaUpd.execute(sqlUpd);		            	 		
            	 		
            	    	    //UPDATE main.applications
            	    	  //  SET channelids = TRIM(BOTH ',' FROM REGEXP_REPLACE(channelids, '(^|,)4(,|$)', '\1\2', 'g'))
            	    	    //		WHERE channelids LIKE '%4%';
						
						
						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);
				} finally {
					if (entityManager != null && entityManager.isOpen()) {
						entityManager.close();
					}
				}
			} else {
				respuesta.setMsg("Sesión expirada o inválida");
				estatus=HttpStatus.UNAUTHORIZED;
				return new ResponseEntity(respuesta, estatus);
				
			}

			
		}
		
	}	
	
	public String arrayAParentesis(List<Integer> lista) {
		
	    if (lista == null || lista.isEmpty()) {
	        return "()";
	    }
	    StringBuilder sb = new StringBuilder("(");
	    for (int i = 0; i < lista.size(); i++) {
	        sb.append(lista.get(i));
	        if (i < lista.size() - 1) {
	            sb.append(", ");
	        }
	    }
	    sb.append(")");
	    return sb.toString();
	}
	
}
