package com.dacrt.SBIABackend.controler;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;

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

import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.dacrt.SBIABackend.dto.AppTypeDto;
import com.dacrt.SBIABackend.dto.AppcoveragedrpContentDto;
import com.dacrt.SBIABackend.dto.AppcoveragedrpContentDto2;
import com.dacrt.SBIABackend.dto.AppcoveragedrpFilterDto;
import com.dacrt.SBIABackend.dto.AppcoveragedrpHeaderDto;
import com.dacrt.SBIABackend.dto.AppcoveragedrpValueDto;
import com.dacrt.SBIABackend.dto.AppcoveragedrpValueDto2;
import com.dacrt.SBIABackend.dto.ApplicationDto;
import com.dacrt.SBIABackend.dto.ApplicationDto2;
import com.dacrt.SBIABackend.dto.ApplicationResponseDto2;
import com.dacrt.SBIABackend.dto.AppstrategyHeaderDto;
import com.dacrt.SBIABackend.dto.AppstrategyResponseDto;
import com.dacrt.SBIABackend.dto.BCPstrategiescontentDto;
import com.dacrt.SBIABackend.dto.BcpstrategiesDto;
import com.dacrt.SBIABackend.dto.CampaignFormat2Dto;
import com.dacrt.SBIABackend.dto.ChannelDto;
import com.dacrt.SBIABackend.dto.ChannelDto2;
import com.dacrt.SBIABackend.dto.ContentDto;
import com.dacrt.SBIABackend.dto.DahboardappprocessdisttopContentDto;
import com.dacrt.SBIABackend.dto.DahboardcampaignContentDto;
import com.dacrt.SBIABackend.dto.DahboardcampaignHeadersDto;
import com.dacrt.SBIABackend.dto.DahboardcampaignSection1Dto;
import com.dacrt.SBIABackend.dto.DrptestDto;
import com.dacrt.SBIABackend.dto.DrptestedDto3;
import com.dacrt.SBIABackend.dto.DrptesttypesDto;
import com.dacrt.SBIABackend.dto.EvalProcessRecordsDto;
import com.dacrt.SBIABackend.dto.FacilityDto2;
import com.dacrt.SBIABackend.dto.FiltersResponseDto;
import com.dacrt.SBIABackend.dto.FiltersResponseDto2;
import com.dacrt.SBIABackend.dto.LabelValueDtoReport2;
import com.dacrt.SBIABackend.dto.LabelValueIntegerDto;
import com.dacrt.SBIABackend.dto.PeriodParResponseDto;
import com.dacrt.SBIABackend.dto.QtyDto;
import com.dacrt.SBIABackend.dto.RecordCatalogoResponseDto;
import com.dacrt.SBIABackend.dto.RecuperationDto;
import com.dacrt.SBIABackend.dto.RegisteredDto;
import com.dacrt.SBIABackend.dto.ResultDto;
import com.dacrt.SBIABackend.dto.ServiceOffers6Dto;
import com.dacrt.SBIABackend.dto.StatusDto;
import com.dacrt.SBIABackend.dto.StatusDto2;
import com.dacrt.SBIABackend.dto.TestTypeResquestDto;
import com.dacrt.SBIABackend.dto.TestedDto;
import com.dacrt.SBIABackend.dto.TypeDto;
import com.dacrt.SBIABackend.dto.TypesUnitDto;
import com.dacrt.SBIABackend.dto.ValueDto;
import com.dacrt.SBIABackend.dto.requestDto.AppcoverageDashRequestDto;
import com.dacrt.SBIABackend.dto.responseDto.AppcoveragedrpResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.ApplicationResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.DahboardapptopResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.DahboardcampaignResponseDto;
import com.dacrt.SBIABackend.dto.responseDto.DashboardStrategiesResponseDto;
import com.dacrt.SBIABackend.repository.ApplicationsRepository;
import com.dacrt.SBIABackend.repository.FacilitiesRepository;
import com.dacrt.SBIABackend.repository.SuppliersRepository;
import com.dacrt.SBIABackend.security.dto.AuditRequestDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesAllDto;
import com.dacrt.SBIABackend.security.dto.RespuestaDto;
import com.dacrt.SBIABackend.security.dto.RespuestaMsgDto;
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;

@RestController
@CrossOrigin(origins = "*")
public class DashboardController {
	
	@Autowired
	private ParamsRepository paramsRepository;

	@Autowired
	private UsersRepository usersRepository;

	@Autowired
	private AuditRepository auditRepository;

	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;

	@Autowired
	UsersService usersService;

	@Autowired
	ParamsService paramsService;

	@Autowired
	SecurityService securityService;

	@Autowired
	MenuService menuService;

	@PersistenceContext
	private EntityManager entityManager;

	@Autowired
	SuppliersRepository suppliersRepository;
	
	@Autowired
	ApplicationsRepository applicationsRepository;
	
	@Autowired
	FacilitiesRepository facilitiesRepository;
	
	
	@PostMapping("/dashboard/bcpstrategies")
	public ResponseEntity<?> bcpstrategiesDash(HttpServletRequest request, 
			@RequestBody AppcoverageDashRequestDto tiposfiltros)
			throws ParseException, UnsupportedEncodingException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
	
		// ParamsDto detalleParams;
	
		
		Long cuantosregistro = (long) 0;
		CampaignFormat2Dto detalleCompaing2;

		List<BcpstrategiesDto> listado=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();
		AppcoveragedrpHeaderDto appcoveragedrpHeaderDto = new AppcoveragedrpHeaderDto();
		int idrol;
		String testtypeIn = "";
		String drptestyesnoparSearch = "";
		String apptypeSearch = "";
		String contentIn = "";
		int searchStatus = 0;
		int facilityIn = 0;
		Integer Inunit;
		int Inqty;
		String InPeriodo;
		int RtoMinutes;
		String fechaComoCadena;
		int orderIn = 0;
		int offsetIn = 0;
		int numofrecordsIn = 0;
		Date fecha2 = new Date();
		int iduser; 
		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();
                 iduser = encontreSessionUsuario.get().getId();
				// 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);

				}
				
				Roles roles = encontreSessionUsuario.get().getRolid();
				idrol = roles.getId();
				int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 700);
				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);

				}
				
				
			      	 Optional<Params> deCarateresPerTextbox=paramsRepository.findByParamname("TEXTBOX_ALLOWED");
				     String caracterespermi=deCarateresPerTextbox.get().getValue();
				   String encoding2 = StandardCharsets.UTF_8.toString();
					String caracteresCodificados2 = URLEncoder.encode(caracterespermi, encoding2);

				 Inunit = tiposfiltros.getUnits();
				 
				// String validarstring = Inunit.toString();
				 
				   /*for (int i = 0; i < validarstring.length(); i++) {
					   
					   char currentChar = validarstring.charAt(i);
			            // Verificar si el carácter no está en el conjunto de permitidos
					   if (caracterespermi.indexOf(currentChar) == -1) {
			                
			                // Si indexOf devuelve -1, el carácter no está permitido.
			             //   String errorMsg = String.format(
			               //     "Error: El carácter '%c' en la posición %d no está permitido.",
			                 //   currentChar, i
			               // );
			                String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Caracteres no permitidos en el Nombre del Usuario"); 
							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
			            }
			        }*/
				       
				 
				 switch (Inunit) { 
				    case 0:  // viene sin busqueda por el like
				    	
				    	String mensaje = "ok";
				     break;
				  
                     case 1:  // viene sin busqueda por el like
				    	
				    	String mensaje2 = "ok";
				     break;
                        default:
                        	String var2 = "";
                        	boolean bloked = false;
    						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
    						respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado- valor no permitido para la Unidad");
    						estatus=HttpStatus.BAD_REQUEST;   
    						return new ResponseEntity(respuestaDto, estatus);
				    	   
				    	
		         }
				 
				    Inqty = tiposfiltros.getQty();
				    InPeriodo = tiposfiltros.getPeriod();
				 
				   RtoMinutes = paramsService.converttoMinute(InPeriodo,Inqty);
								

			} 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 SentenciaBaseIn1 = "";
			String SentenciaBaseIn2 = "";
			Query query;
			Query query2;
			Query query3;
		    String tipoTest;
		    		    
		   // iduser = 55;
  	             String filtroUnit = " AND uu.userid = " +  iduser;
  			    
			SentenciaBaseIn1 = " WITH CampanasConRanking AS ( "
					+ "    SELECT id, dateto, ROW_NUMBER() OVER (ORDER BY dateto DESC) AS ranking_campana "
					+ "    FROM main.campaigns "
					+ "    WHERE DATE_TRUNC('day', dateto) <= CURRENT_DATE "
					//WHERE DATE_TRUNC('day', dateto) <= CURRENT_DATE
					+ "), "
					+ "ProcesoEstrategiaCascada AS ( "
					+ "    SELECT P.id AS processid, P.name AS process_name, E.strategytypepar, cr.id AS campid, "
					+ "        MIN(ei.rtoqty) AS rto_minimo_campana, "
					+ "        ROW_NUMBER() OVER (PARTITION BY P.id ORDER BY cr.ranking_campana ASC, MIN(ei.rtoqty) ASC) AS rn "
					+ "    FROM main.processes P "
					+ "    INNER JOIN main.unitprocesses u ON u.processid = P.id "
					+ "    INNER JOIN main.userunits uu ON u.unitid = uu.unitid "
					+ "    INNER JOIN main.evalprocesses ep ON ep.unitprocessid = u.id "
					+ "    INNER JOIN main.evalprocimpacts ei ON ep.id = ei.evalprocessid "
					+ "    INNER JOIN main.campaignunits cu ON ep.campaignunitid = cu.id "
					+ "    INNER JOIN main.campaigns c ON cu.campaingid = c.id  "  //and c.status=1
					+ "    INNER JOIN CampanasConRanking cr ON c.id = cr.id  "
					+ "    LEFT JOIN main.strategiesdetprocesses SP ON u.id = SP.unitprocessid "
					+ "    LEFT JOIN main.strategiesdet D ON SP.strategyid = D.id "
					+ "    LEFT JOIN main.strategies E ON D.strategyid = E.id "
					+ "    WHERE P.status <> 0 AND COALESCE(D.status, 1) <> 0  and ep.impactst = 1  "  //hice un filtro por el impactsc verificar
					+ "    AND ei.rtoqty <= " + RtoMinutes ;
					if 	(Inunit==1) {
						SentenciaBaseIn1 = SentenciaBaseIn1 + filtroUnit;
					} else {
						SentenciaBaseIn1 = SentenciaBaseIn1;
					}
					SentenciaBaseIn1 = SentenciaBaseIn1 + "    GROUP BY "
					+ "        P.id, P.name, E.strategytypepar, cr.id, cr.ranking_campana "
					+ "), "
					+ "DatosRelevantes AS ( "
					+ "    SELECT "
					+ "        P.process_name, "
					+ "        COALESCE(P.strategytypepar, '0') AS strategytypepar "
					+ "    FROM ProcesoEstrategiaCascada P "
					+ "    WHERE P.rn = 1 )"
					+ " SELECT 'Con BCP' AS bcp, COALESCE( ROUND(      "
					+ "	CAST(SUM(CASE WHEN (T.strategytypepar = '1') THEN 1 ELSE 0 END) * 100 AS NUMERIC) / NULLIF(COUNT(*), 0), 2),     0.00) AS pctconbcp, 'Sin BCP' AS sinbcp,  "
					+ "	COALESCE( ROUND(         CAST(SUM(CASE WHEN (T.strategytypepar IS NULL OR T.strategytypepar <> '1') THEN 1 ELSE 0 END) * 100 AS NUMERIC) / NULLIF(COUNT(*), 0), 2),     100.00) "
					+ "	AS pctsinbcp, COALESCE( ROUND(      "
					+ "	CAST(SUM(CASE WHEN (T.strategytypepar = '1') THEN 1 ELSE 0 END) * 100 AS NUMERIC) / NULLIF(COUNT(*), 0), 2),     0.00)||'%' AS pctconbcptext, "
					+ "	COALESCE( ROUND(         CAST(SUM(CASE WHEN (T.strategytypepar IS NULL OR T.strategytypepar <> '1') THEN 1 ELSE 0 END) * 100 AS NUMERIC) / NULLIF(COUNT(*), 0), 2),     100.00)||'%' "
					+ "	AS pctsinbcptext, "
					+ "   COALESCE(CAST(SUM(CASE WHEN (T.strategytypepar = '1') THEN 1 ELSE 0 END)AS NUMERIC),0) AS procesos_con_bcp_qty,  "
					+ "   COALESCE(CAST(SUM(CASE WHEN (T.strategytypepar IS NULL OR T.strategytypepar <> '1') THEN 1 ELSE 0 END)AS NUMERIC),0) AS procesos_sin_bcp_qty "
					+ "	FROM DatosRelevantes T  ";
					
				
		
					query = entityManager.createNativeQuery(SentenciaBaseIn1);
					List<Object[]> listacompleta = query.getResultList();
					
					FiltersResponseDto2 filtersResponseDto = new FiltersResponseDto2();
					BcpstrategiesDto bcpstrategiesDto= new BcpstrategiesDto();
					BCPstrategiescontentDto content= new BCPstrategiescontentDto();
					AppcoveragedrpContentDto2 appcoveragedrpContentDto = new AppcoveragedrpContentDto2();
					AppcoveragedrpContentDto2 appcoveragedrpContentDto2 = new AppcoveragedrpContentDto2();
					
					 List<AppcoveragedrpContentDto2> listasContent = new ArrayList<>();
					 
					AppcoveragedrpValueDto2 appcoveragedrpValueDto = new AppcoveragedrpValueDto2();
					AppcoveragedrpValueDto2 appcoveragedrpValueDto2 = new AppcoveragedrpValueDto2();
					DashboardStrategiesResponseDto  dashboardStrategiesResponseDto = new DashboardStrategiesResponseDto();
					QtyDto qtyDto= new QtyDto();
					for (Object[] reg : listacompleta) {
						/*bcpstrategiesDto.setLabel((String) reg[0]);
						bcpstrategiesDto.setValue((Number) reg[1]);
						listado.add(bcpstrategiesDto);
						bcpstrategiesDto= new BcpstrategiesDto();*/
						
						appcoveragedrpContentDto = new AppcoveragedrpContentDto2();
						appcoveragedrpValueDto = new AppcoveragedrpValueDto2();
						appcoveragedrpContentDto2 = new AppcoveragedrpContentDto2();
						appcoveragedrpValueDto2 = new AppcoveragedrpValueDto2();
						
						appcoveragedrpValueDto.setPercent((String) reg[4]);
						appcoveragedrpValueDto.setNumber((BigDecimal) reg[6]);
						
						appcoveragedrpContentDto.setName((String) reg[0]);
						appcoveragedrpContentDto.setValue(appcoveragedrpValueDto);
						
						appcoveragedrpValueDto2.setPercent((String) reg[5]);
						appcoveragedrpValueDto2.setNumber((BigDecimal) reg[7]);
						
						appcoveragedrpContentDto2.setName((String) reg[2]);
						appcoveragedrpContentDto2.setValue(appcoveragedrpValueDto2);
						
			
						listasContent.add(appcoveragedrpContentDto);
						
						listasContent.add(appcoveragedrpContentDto2);
						
					}
					
					
					String queryPeriodo = " SELECT elemento ->> 'dsc' AS descr,elemento ->> 'value' AS valor "
							+ "	FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento   "
							+ "	 WHERE p.paramname = 'EVALPROC_PERIOD' ";
					TypesUnitDto detalleTypesPer;
					 List<TypesUnitDto> listasTypesPeriodo = new ArrayList<>();
					Query queryPeri = entityManager.createNativeQuery(queryPeriodo);
				       List<Object[]> listaperiodo= queryPeri.getResultList();
				       for (Object[] types : listaperiodo) {
				    	   detalleTypesPer = new TypesUnitDto();
				    	  
				    	   detalleTypesPer.setDsc((String) types[0]);
				    	   detalleTypesPer.setValue((String) types[1]);
				    	   listasTypesPeriodo.add(detalleTypesPer);
				       }
				    //   filtersResponseDto.setApptypes(listasTypesPeriodo);
				       filtersResponseDto.setPeriods(listasTypesPeriodo);
				//	return listado;
					appcoveragedrpHeaderDto.setTitle("Proporción de procesos con estrategia BCP");
		           // content.setContent(listado);
		            dashboardStrategiesResponseDto.setHeader(appcoveragedrpHeaderDto);
		            dashboardStrategiesResponseDto.setContent(listasContent);
		            dashboardStrategiesResponseDto.setFilters(filtersResponseDto);
		            
		  
			return ResponseEntity.ok(dashboardStrategiesResponseDto);



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

		return new ResponseEntity(respuesta, estatus);

	}
	
	
	
	@PostMapping("/dashboard/appcoverage")
	public ResponseEntity<?> appcoverageDash(HttpServletRequest request, 
			@RequestBody AppcoverageDashRequestDto tiposfiltros)
			throws ParseException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		AppcoveragedrpValueDto appcoveragedrpValueDto = new AppcoveragedrpValueDto();
		AppcoveragedrpFilterDto appcoveragedrpFilterDto = new AppcoveragedrpFilterDto();
		AppcoveragedrpHeaderDto appcoveragedrpHeaderDto = new AppcoveragedrpHeaderDto();
		AppcoveragedrpContentDto appcoveragedrpContentDto = new AppcoveragedrpContentDto();
		AppcoveragedrpResponseDto appcoveragedrpResponseDto = new AppcoveragedrpResponseDto();
		
		// ParamsDto detalleParams;
		ApplicationDto detalleApplication;
		ApplicationDto2 detalleApplication2;
		StatusDto detalleStatus;
		PrivilegesAllDto detallePrivilege;
		FacilityDto2 detallefacility;
		Long cuantosregistro = (long) 0;
		CampaignFormat2Dto detalleCompaing2;

		List<PrivilegesAllDto> 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 idrol;
		String testtypeIn = "";
		String drptestyesnoparSearch = "";
		String apptypeSearch = "";
		String contentIn = "";
		int searchStatus = 0;
		int facilityIn = 0;
		int Inunit;
		int Inqty;
		String InPeriodo;
		int RtoMinutes;
		String fechaComoCadena;
		int orderIn = 0;
		int offsetIn = 0;
		int numofrecordsIn = 0;
		Date fecha2 = new Date();
		int iduser; 
		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();
                 iduser = encontreSessionUsuario.get().getId();
				// 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);

				}
				
				Roles roles = encontreSessionUsuario.get().getRolid();
				idrol = roles.getId();
				int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 700);
				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);

				}
				

				 Inunit = tiposfiltros.getUnits();
				 
				 switch (Inunit) { 
				    case 0:  // viene sin busqueda por el like
				    	
				    	String mensaje = "ok";
				     break;
				  
                     case 1:  // viene sin busqueda por el like
				    	
				    	String mensaje2 = "ok";
				     break;
                        default:
                        	String var2 = "";
                        	boolean bloked = false;
    						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
    						respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado- valor no permitido para la Unidad");
    						estatus=HttpStatus.BAD_REQUEST;   
    						return new ResponseEntity(respuestaDto, estatus);
				    	   
				    	
		         }
				 
				    Inqty = tiposfiltros.getQty();
				    InPeriodo = tiposfiltros.getPeriod();
				 
				   RtoMinutes = paramsService.converttoMinute(InPeriodo,Inqty);
								

			} 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 SentenciaBaseIn1 = "";
			String SentenciaBaseIn2 = "";
			Query query;
			Query query2;
			Query query3;
		    String tipoTest;
		    		    
		   // iduser = 55;
  	             String filtroUnit = " AND uu.userid = " +  iduser;
  			    
			SentenciaBaseIn1 = " WITH EvaluacionesUnicas AS (  "
					+ "    SELECT a.id AS apid, a.name AS apname,  "
					+ "        MAX(CASE WHEN e.strategytypepar = 2 AND ed.status = 1 AND e.status = 1 THEN 1 ELSE 0 END) AS posee_estrategia, "
					+ "        MIN(ei.rtoqty) AS rto_minimo_campana "
					+ "    FROM main.applications a  "
					+ "    INNER JOIN main.evalprocapps ea ON ea.applicationid = a.id  "
					+ "    INNER JOIN main.evalprocimpacts ei ON ea.evalprocessid = ei.evalprocessid  "
					+ "    INNER JOIN main.evalprocesses ep ON ea.evalprocessid = ep.id  "
					+ "    INNER JOIN main.campaignunits cu ON ep.campaignunitid = cu.id  "
					+ "    INNER JOIN main.campaigns c ON cu.campaingid = c.id  "
					+ "    INNER JOIN main.unitprocesses up ON ep.unitprocessid = up.id  "
					+ "    INNER JOIN main.userunits uu ON up.unitid = uu.unitid  "
					+ "    LEFT JOIN main.strategiesdet ed ON ed.applicationid = a.id  "
					+ "    LEFT JOIN main.strategies e ON ed.strategyid = e.id  "
					+ " WHERE a.status = 1 AND ep.impactst = 1 AND ep.appst = 1 ";
					
				if 	(Inunit==1) {
					SentenciaBaseIn1 = SentenciaBaseIn1 + filtroUnit;
				} else {
					SentenciaBaseIn1 = SentenciaBaseIn1;
				}
				SentenciaBaseIn1 = SentenciaBaseIn1	+ " GROUP BY a.id, a.name "
					+ " HAVING MIN(ei.rtoqty) <= "  + RtoMinutes
					+ "  ),  "
					+ "  ResultadosFinales AS (  "
					+ "    SELECT apid, apname,  "
					+ "        CASE  "
					+ "            WHEN posee_estrategia = 1 THEN 'Poseen'  "
					+ "            ELSE 'No Poseen'  "
					+ "        END AS tipo_estrategia  "
					+ "    FROM EvaluacionesUnicas "
					+ " ),  "
					+ " CategoriasDisponibles AS (  "
					+ "    SELECT 'Poseen' AS tipo_estrategia  "
					+ "    UNION ALL  "
					+ "    SELECT 'No Poseen'  "
					+ " )  "
					+ " SELECT  "
					+ "    cd.tipo_estrategia,   "
					+ "    COALESCE(CAST(COUNT(rf.apid) AS INTEGER), 0) AS cantidad_aplicaciones,  "
					+ "    CAST( "
					+ "        ROUND( "
					+ "            CAST(COUNT(rf.apid) AS NUMERIC) * 100 / "
					+ "            NULLIF((SELECT COUNT(*) FROM ResultadosFinales), 0), "
					+ "            2 "
					+ "        ) AS TEXT "
					+ "    ) || '%' AS porcentaje_del_total, "
					+ "	STRING_AGG(CAST(rf.apname AS TEXT), ',') AS aplicaciones "
					+ " FROM  "
					+ "    CategoriasDisponibles cd  "
					+ " LEFT JOIN  "
					+ "    ResultadosFinales rf ON cd.tipo_estrategia = rf.tipo_estrategia  "
					+ " GROUP BY  "
					+ "    cd.tipo_estrategia  "
					+ " ORDER BY  "
					+ "    cantidad_aplicaciones DESC ";					   
		    	          
		
			   query = entityManager.createNativeQuery(SentenciaBaseIn1);
		       query.setFirstResult(offsetIn);
			   query.setMaxResults(numofrecordsIn);
			   List<Object[]> listacompleta = query.getResultList();
			   List<AppcoveragedrpContentDto> listasContent = new ArrayList<>();
			   appcoveragedrpResponseDto = new AppcoveragedrpResponseDto();
			   appcoveragedrpFilterDto = new AppcoveragedrpFilterDto();
			   TypesUnitDto detallePeriodo = new TypesUnitDto();
			   int cuantosregistros = listacompleta.size();
			  // cuantosregistros = 0;
			   if (cuantosregistros>0) {
			   for (Object[] reg : listacompleta) {	
				    appcoveragedrpValueDto = new AppcoveragedrpValueDto();
					 
					 appcoveragedrpHeaderDto = new AppcoveragedrpHeaderDto();
					 appcoveragedrpContentDto = new AppcoveragedrpContentDto();
					 
					 
					 appcoveragedrpValueDto.setNumber((int) reg[1]);
					 int valor =(int) reg[1];
					 if (valor==0) {
						 appcoveragedrpValueDto.setFormatted("0%");
					 } else {
						 appcoveragedrpValueDto.setFormatted((String) reg[2]);
					 }
					
					 appcoveragedrpContentDto.setName((String) reg[0]);
					 appcoveragedrpContentDto.setValue(appcoveragedrpValueDto);
					 
					 listasContent.add(appcoveragedrpContentDto);
					 
				   
			    }
			   } else {
				     appcoveragedrpHeaderDto = new AppcoveragedrpHeaderDto();
					 appcoveragedrpContentDto = new AppcoveragedrpContentDto();
					 appcoveragedrpValueDto = new AppcoveragedrpValueDto();
					 
					 AppcoveragedrpValueDto appcoveragedrpValueDto2 = new AppcoveragedrpValueDto();
						
					 AppcoveragedrpContentDto appcoveragedrpContentDto2 = new AppcoveragedrpContentDto();
						
					 appcoveragedrpContentDto2 = new AppcoveragedrpContentDto();
					 appcoveragedrpValueDto2 = new AppcoveragedrpValueDto();
					 
					 appcoveragedrpValueDto.setNumber(0);
					 appcoveragedrpValueDto.setFormatted("0%");
					 appcoveragedrpContentDto.setName("Poseen");
					 appcoveragedrpContentDto.setValue(appcoveragedrpValueDto);
					 
					 
					 appcoveragedrpValueDto2.setNumber(0);
					 appcoveragedrpValueDto2.setFormatted("0%");
					 appcoveragedrpContentDto2.setName("No Poseen");
					 appcoveragedrpContentDto2.setValue(appcoveragedrpValueDto2);
					 
					 listasContent.add(appcoveragedrpContentDto);
					 listasContent.add(appcoveragedrpContentDto2);
			   } 
			   
			
			String queryPeriodo = " SELECT elemento ->> 'dsc' AS descr,elemento ->> 'value' AS valor "
					+ "	FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento   "
					+ "	 WHERE p.paramname = 'EVALPROC_PERIOD' ";
			TypesUnitDto detalleTypesPer;
			 List<TypesUnitDto> listasTypesPeriodo = new ArrayList<>();
			Query queryPeri = entityManager.createNativeQuery(queryPeriodo);
		       List<Object[]> listaperiodo= queryPeri.getResultList();
		       for (Object[] types : listaperiodo) {
		    	   detalleTypesPer = new TypesUnitDto();
		    	  
		    	   detalleTypesPer.setDsc((String) types[0]);
		    	   detalleTypesPer.setValue((String) types[1]);
		    	   listasTypesPeriodo.add(detalleTypesPer);
		       }
			
		       appcoveragedrpFilterDto.setPeriods(listasTypesPeriodo);
		       appcoveragedrpHeaderDto.setTitle("Cobertura de Aplicaciones con Estrategia DRP");
		       
		       appcoveragedrpResponseDto.setContent(listasContent);
		       appcoveragedrpResponseDto.setFilters(appcoveragedrpFilterDto);
		       appcoveragedrpResponseDto.setHeader(appcoveragedrpHeaderDto);
		       
			return ResponseEntity.ok(appcoveragedrpResponseDto);



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

		return new ResponseEntity(respuesta, estatus);

	}
	
	@PostMapping("/dashboard/campaignstatus")
	public ResponseEntity<?> campaignstatusDashViejo(HttpServletRequest request, 
			@RequestBody AppcoverageDashRequestDto tiposfiltros)
			throws ParseException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		
		LabelValueIntegerDto detalleLabelValueDtoestado = new LabelValueIntegerDto();
		LabelValueIntegerDto detalleLabelValueDtoalcance = new LabelValueIntegerDto();
		LabelValueIntegerDto detalleLabelValueDtodistri = new LabelValueIntegerDto();
		DahboardcampaignContentDto dahboardcampaignContentDto1 = new DahboardcampaignContentDto();
		DahboardcampaignContentDto dahboardcampaignContentDto2 = new DahboardcampaignContentDto();
		DahboardcampaignContentDto dahboardcampaignContentDto3 = new DahboardcampaignContentDto();
		DahboardcampaignHeadersDto dahboardcampaignHeadersDto = new DahboardcampaignHeadersDto();
		DahboardcampaignResponseDto dahboardcampaignResponseDto = new DahboardcampaignResponseDto();
		DahboardcampaignSection1Dto dahboardcampaignSection1Dto = new DahboardcampaignSection1Dto();
		DahboardcampaignSection1Dto dahboardcampaignSection2Dto = new DahboardcampaignSection1Dto();
		DahboardcampaignSection1Dto dahboardcampaignSection3Dto = new DahboardcampaignSection1Dto();
		List<DahboardcampaignContentDto> dahboardcampaignContentDto1List = new ArrayList();
		
		// ParamsDto detalleParams;
	
		Long cuantosregistro = (long) 0;
		CampaignFormat2Dto detalleCompaing2;

		List<PrivilegesAllDto> 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 idrol;
	
		String contentIn = "";
		int searchStatus = 0;
		int facilityIn = 0;
		int Inunit;
		int idcampana;
		String InPeriodo;
		int RtoMinutes;
		String fechaComoCadena;
		
		Date fecha2 = new Date();
		int iduser; 
		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();
                 iduser = encontreSessionUsuario.get().getId();
				// 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);

				}
				
				Roles roles = encontreSessionUsuario.get().getRolid();
				idrol = roles.getId();
				int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 700);
				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);

				}
				

				 Inunit = tiposfiltros.getUnits();
				 
				 
				 
				 switch (Inunit) { 
				    case 0:  // viene sin busqueda por el like
				    	
				    	String mensaje = "ok";
				    	
				     break;
				  
                     case 1:  // viene sin busqueda por el like
				    	
				    	String mensaje2 = "ok";
				     break;
                        default:
                        	String var2 = "";
                        	boolean bloked = false;
    						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
    						respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado- valor no permitido para la Unidad");
    						estatus=HttpStatus.BAD_REQUEST;   
    						return new ResponseEntity(respuestaDto, estatus);
				    	   
				    	
		         }
				 
				    idcampana = tiposfiltros.getCampaignid();
				 
								

			} 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 SentenciaBase1 = "";
			String SentenciaBase2 = "";
			String SentenciaBase3 = "";
			Query query;
			Query query2;
			Query query3;
			String textCammaping1;
			String textUnits1;
			String textUnits2;
			String textUnits3;
			//idcampana = 12;
			//iduser = 55;
		    //////////////////////comenzamos a armar la primera parte de la salida con el query//////////////estado de los procesos de la evaluacion
  			    if (idcampana==0) {
  			    	 textCammaping1 = " WHERE  (null IS NOT NULL AND c.id = null) OR  (null IS NULL AND (  ";
  			    } else {
  			    		
  			    	textCammaping1 = " WHERE  ( "  + idcampana + " IS NOT NULL AND c.id =  " + idcampana + ") OR  ( " + idcampana + " IS NULL AND (  ";
  			    }
  			    
  			  if (Inunit==0) {
			    	 textUnits1 = "  AND (  null IS NULL "
			    	 		+ "        OR ep.unitprocessid IN (  SELECT up.id  FROM main.unitprocesses up "
			    	 		+ "       INNER JOIN main.userunits uu ON up.unitid = uu.unitid "
			    	 		+ "        WHERE uu.userid = null ) )  GROUP BY estado_evaluacion),";
			    	 textUnits2 = " ep.impactst = 1  GROUP BY  cu.campaingid ), ";
			    	 
			    	 textUnits3 = " (  null IS NULL  OR up.unitid IN (  SELECT unitid FROM main.userunits WHERE userid = null ) ) ";
			    } else {
			    		
			    	textUnits1 = "  AND ( " +  iduser + " IS NULL "
			    			+ "        OR ep.unitprocessid IN (  SELECT up.id  FROM main.unitprocesses up "
			    			+ "       INNER JOIN main.userunits uu ON up.unitid = uu.unitid "
			    			+ "        WHERE uu.userid = "  +  iduser +  " ) )  GROUP BY estado_evaluacion),";
			    	textUnits2 = " ep.impactst = 1 AND uu.userid = " + iduser + "  GROUP BY  cu.campaingid  ),";
			    	textUnits3 = " ( " +  iduser + " IS NULL  OR up.unitid IN (  SELECT unitid FROM main.userunits WHERE userid = " + iduser + " ) ) ";
			    }
  			    
			SentenciaBase1 = "WITH CampanaSeleccionada AS (  "
					+ "    SELECT c.id  "
					+ "    FROM  main.campaigns c  ";
			SentenciaBase1 = SentenciaBase1 + textCammaping1;
			SentenciaBase1 = SentenciaBase1  +  "   c.status = 1 OR c.id = (  "
					+ "  SELECT id FROM main.campaigns ORDER BY createdat DESC LIMIT 1 ) ))"
					+ "    ORDER BY "
					+ "        c.status DESC, c.createdat DESC "
					+ "    LIMIT 1 "
					+ "), "
					+ "ResultadosBase AS ( "
					+ "    SELECT "
					+ "        CASE "
					+ "            WHEN ep.impactst = 1 AND ep.appst = 1 AND ep.suplierst = 1 AND ep.recordst = 1 AND ep.periodst = 1 AND ep.inputst = 1 AND ep.reportst = 1 THEN 'Completados' "
					+ "            WHEN ep.impactst = 0 AND ep.appst = 0 AND ep.suplierst = 0 AND ep.recordst = 0 AND ep.periodst = 0 AND ep.inputst = 0 AND ep.reportst = 0 THEN 'No Iniciados' "
					+ "            ELSE 'En Proceso' "
					+ "        END AS estado_evaluacion, "
					+ "        CAST(COUNT(ep.id) AS INTEGER) AS cantidad_procesos "
					+ "    FROM "
					+ "        main.evalprocesses ep "
					+ "    INNER JOIN "
					+ "        main.campaignunits cu ON ep.campaignunitid = cu.id "
					+ "    WHERE "
					+ "        cu.campaingid IN (SELECT id FROM CampanaSeleccionada) ";
			SentenciaBase1 = SentenciaBase1 + textUnits1 + " Categorias AS ( "
					+ "    SELECT 'Completados' AS estado_evaluacion "
					+ "    UNION ALL SELECT 'En Proceso' "
					+ "    UNION ALL SELECT 'No Iniciados' "
					+ " ) "
					+ " SELECT "
					+ "    c.estado_evaluacion, "
					+ "    COALESCE(rb.cantidad_procesos, 0) AS cantidad_procesos "
					+ " FROM "
					+ "    Categorias c "
					+ " LEFT JOIN "
					+ "    ResultadosBase rb ON c.estado_evaluacion = rb.estado_evaluacion "
					+ " ORDER BY "
					+ "    c.estado_evaluacion ASC";	
			
			 //////////////////////fin de armar la primera parte de la salida con el query//////////////estado de los procesos de la evaluacion	asociadas
					
              //////////////////////comenzamos a armar la segunda parte de la salida con el query//////////////alcance de la dependencias asociadas
			SentenciaBase2 = " WITH CampanaSeleccionada AS ( "
					+ "     SELECT  c.id FROM  main.campaigns c  ";
			SentenciaBase2 = SentenciaBase2 + textCammaping1;
			SentenciaBase2 = SentenciaBase2  + "    c.status = 1 OR c.id = ( "
					+ "             SELECT id FROM main.campaigns ORDER BY createdat DESC LIMIT 1 "
					+ "         ) "
					+ "     )) "
					+ "     ORDER BY "
					+ "         c.status DESC, c.createdat DESC "
					+ "     LIMIT 1 "
					+ " ), "
					+ " ResultadosRaw AS ( "
					+ "     SELECT "
					+ "         cu.campaingid, "
					+ "         CAST(COUNT(DISTINCT CASE WHEN ep.appst = 1 AND a.status = 1 THEN eap.applicationid END) AS INTEGER) AS Aplicaciones, "
					+ "         CAST(COUNT(DISTINCT CASE WHEN ep.suplierst = 1 AND s.status = 1 THEN esu.supplierid END) AS INTEGER) AS Suppliers, "
					+ "         CAST(COUNT(DISTINCT CASE WHEN ep.recordst = 1 THEN ere.name END) AS INTEGER) AS Record "
					+ "     FROM main.evalprocesses ep "
					+ "     INNER JOIN main.campaignunits cu ON ep.campaignunitid = cu.id "
					+ "     INNER JOIN main.unitprocesses up ON ep.unitprocessid = up.id "
					+ "     INNER JOIN  main.userunits uu ON up.unitid = uu.unitid "
					+ "     INNER JOIN CampanaSeleccionada cs ON cu.campaingid = cs.id "
					+ "     LEFT JOIN main.evalprocapps eap ON ep.id = eap.evalprocessid "
					+ "     LEFT JOIN  main.applications a ON eap.applicationid = a.id "
					+ "     LEFT JOIN main.evalprocsupliers esu ON ep.id = esu.evalprocessid "
					+ "     LEFT JOIN main.suppliers s ON esu.supplierid = s.id "
					+ "     LEFT JOIN  main.evalprocrecords ere ON ep.id = ere.evalprocessid "
					+ "     WHERE ";
			SentenciaBase2 = SentenciaBase2 + textUnits2;
			SentenciaBase2 = SentenciaBase2 + " Categorias AS ( "
					+ "     SELECT 'Aplicaciones' AS categoria, 1 AS orden "
					+ "     UNION ALL "
					+ "     SELECT 'Proveedores', 2 "
					+ "     UNION ALL "
					+ "     SELECT 'Registros Vitales', 3 "
					+ " ) "
					+ " SELECT "
					+ "     c.categoria, "
					+ "     rr.campaingid, "
					+ "     COALESCE(CASE "
					+ "             WHEN c.categoria = 'Aplicaciones' THEN rr.Aplicaciones "
					+ "             WHEN c.categoria = 'Proveedores' THEN rr.Suppliers "
					+ "             WHEN c.categoria = 'Registros Vitales' THEN rr.Record "
					+ "         END, "
					+ "         0 "
					+ "     ) AS cantidad "
					+ " FROM Categorias c "
					+ " LEFT JOIN ResultadosRaw rr ON 1=1 "
					+ " ORDER BY  c.orden ";
				
             //////////////////////fin de armar la segunda parte de la salida con el query//////////////alcance de la dependencias asociadas
			
              //////////////////////comenzamos a armar la tercera parte de la salida con el query//////////////distribucion rto de los procesos
			
			SentenciaBase3 = " WITH CampanaSeleccionada AS ( "
					+ "    SELECT   c.id FROM  main.campaigns c ";
			SentenciaBase3 = SentenciaBase3 + textCammaping1;
			SentenciaBase3 = SentenciaBase3 + "    c.status = 1 OR c.id = (  SELECT id FROM main.campaigns ORDER BY createdat DESC LIMIT 1 ) )) "
					+ "    ORDER BY c.status DESC, c.createdat DESC LIMIT 1 "
					+ " ), "
					+ " RangosDisponibles AS ( "
					+ "    SELECT '≤02h' AS rango_rto, 1 AS orden UNION ALL "
					+ "    SELECT '04h', 2 UNION ALL "
					+ "    SELECT '08h', 3 UNION ALL "
					+ "    SELECT '12h', 4 UNION ALL "
					+ "    SELECT '24h', 5 UNION ALL "
					+ "    SELECT '48h', 6 UNION ALL "
					+ "    SELECT '>48h', 7 "
					+ " ), "
					+ " DatosFiltrados AS ( "
					+ "    SELECT CASE WHEN ei.rtoqty <= 120 THEN '≤02h' "
					+ "            WHEN ei.rtoqty > 120 AND ei.rtoqty <= 240 THEN '04h' "
					+ "            WHEN ei.rtoqty > 240 AND ei.rtoqty <= 480 THEN '08h' "
					+ "            WHEN ei.rtoqty > 480 AND ei.rtoqty <= 720 THEN '12h' "
					+ "            WHEN ei.rtoqty > 720 AND ei.rtoqty <= 1440 THEN '24h' "
					+ "            WHEN ei.rtoqty > 1440 AND ei.rtoqty <= 2880 THEN '48h' "
					+ "            ELSE '>48h' "
					+ "        END AS rango_rto, "
					+ "        ep.id AS proceso_id "
					+ "    FROM    main.evalprocesses ep "
					+ "    INNER JOIN  main.campaignunits cu ON ep.campaignunitid = cu.id "
					+ "    INNER JOIN main.evalprocimpacts ei ON ep.id = ei.evalprocessid "
					+ "    INNER JOIN main.unitprocesses up ON ep.unitprocessid = up.id "
					+ "    INNER JOIN  CampanaSeleccionada cs ON cu.campaingid = cs.id "
					+ "    WHERE " ;
			SentenciaBase3 = SentenciaBase3 + textUnits3;
			SentenciaBase3 = SentenciaBase3  + "	and  ep.impactst = 1 ) "
					+ " SELECT rd.rango_rto, cast(COALESCE(COUNT(df.proceso_id), 0) as integer) AS cantidad_procesos "
					+ " FROM RangosDisponibles rd "
					+ " LEFT JOIN  DatosFiltrados df ON rd.rango_rto = df.rango_rto "
					+ " GROUP BY  rd.rango_rto, rd.orden "
					+ " ORDER BY rd.orden ";    
			  //////////////////////fin de  armar la tercera parte de la salida con el query//////////////distribucion rto de los procesos
			   query = entityManager.createNativeQuery(SentenciaBase1);
			   List<Object[]> listacompleta1 = query.getResultList();
			
			   query2 = entityManager.createNativeQuery(SentenciaBase2);
			   List<Object[]> listacompleta2 = query2.getResultList();
			   
			   query3 = entityManager.createNativeQuery(SentenciaBase3);
			   List<Object[]> listacompleta3 = query3.getResultList();
			   List<DahboardcampaignContentDto> contentList = new ArrayList<>();
			     detalleLabelValueDtoestado = new LabelValueIntegerDto();
				 detalleLabelValueDtoalcance = new LabelValueIntegerDto();
				 detalleLabelValueDtodistri = new LabelValueIntegerDto();
				 dahboardcampaignContentDto1 = new DahboardcampaignContentDto();
				 dahboardcampaignContentDto2 = new DahboardcampaignContentDto();
				 dahboardcampaignContentDto3 = new DahboardcampaignContentDto();
				 dahboardcampaignHeadersDto = new DahboardcampaignHeadersDto();
				 dahboardcampaignResponseDto = new DahboardcampaignResponseDto();
				 dahboardcampaignSection1Dto = new DahboardcampaignSection1Dto();
				 List<DahboardcampaignSection1Dto> dahboardcampaignSection1DtoList = new ArrayList();
				 List<DahboardcampaignSection1Dto> dahboardcampaignSection2DtoList = new ArrayList();
				 List<DahboardcampaignSection1Dto> dahboardcampaignSection3DtoList = new ArrayList();
				 List<LabelValueIntegerDto> estadoEvaluacionList = new ArrayList<>();
				 List<LabelValueIntegerDto> estadoEvaluacionList2 = new ArrayList<>();
				 List<LabelValueIntegerDto> estadoEvaluacionList3 = new ArrayList<>();
				  dahboardcampaignContentDto1List = new ArrayList();
				  
			   int cuantosregistros1 = listacompleta1.size();
			   int cuantosregistros2 = listacompleta2.size();
			   int cuantosregistros3 = listacompleta3.size();
			   
			   if (cuantosregistros1>0) {
				   for (Object[] reg : listacompleta1) {	
					   detalleLabelValueDtoestado = new LabelValueIntegerDto();
					   dahboardcampaignContentDto1 = new DahboardcampaignContentDto();
					   dahboardcampaignSection1Dto = new DahboardcampaignSection1Dto();
					   
					   detalleLabelValueDtoestado.setLabel((String) reg[0]) ;
					   detalleLabelValueDtoestado.setValue((int) reg[1]);
					   estadoEvaluacionList.add(detalleLabelValueDtoestado);
					   
					   //dahboardcampaignSection1Dto.setSections(detalleLabelValueDtoestado);
					   //dahboardcampaignSection1DtoList.add(dahboardcampaignSection1Dto);
					   
				    }
				   } 
			   dahboardcampaignContentDto1.setName("Estado de Evaluación (procesos)");
			   dahboardcampaignContentDto1.setSections(estadoEvaluacionList);
			
			   if (cuantosregistros2>0) {
				   for (Object[] reg2 : listacompleta2) {	
					   detalleLabelValueDtoalcance = new LabelValueIntegerDto();
					   dahboardcampaignSection2Dto = new DahboardcampaignSection1Dto();
					   
					   detalleLabelValueDtoalcance.setLabel((String) reg2[0]) ;
					   detalleLabelValueDtoalcance.setValue((int) reg2[2]);
					   estadoEvaluacionList2.add(detalleLabelValueDtoalcance);
					   //dahboardcampaignSection2Dto.setSections(detalleLabelValueDtoalcance);
					   //dahboardcampaignSection2DtoList.add(dahboardcampaignSection2Dto);
					   
				    }
				   } 
			   dahboardcampaignContentDto2.setName("Alcance de las Dependencias Asociadas");
			   dahboardcampaignContentDto2.setSections(estadoEvaluacionList2);
			   
			   if (cuantosregistros3>0) {
				   for (Object[] reg3 : listacompleta3) {	
					   detalleLabelValueDtodistri = new LabelValueIntegerDto();
					   dahboardcampaignSection3Dto = new DahboardcampaignSection1Dto();
					   
					   detalleLabelValueDtodistri.setLabel((String) reg3[0]) ;
					   detalleLabelValueDtodistri.setValue((int) reg3[1]);
					   estadoEvaluacionList3.add(detalleLabelValueDtodistri);
					  // dahboardcampaignSection3Dto.setSections(detalleLabelValueDtodistri);
					 //  dahboardcampaignSection3DtoList.add(dahboardcampaignSection3Dto);
					   
				    }
				   } 
			   dahboardcampaignContentDto3.setName("Distribución de RTO de los Procesos");
			   dahboardcampaignContentDto3.setSections(estadoEvaluacionList3);
		       
			   
			   
			   dahboardcampaignHeadersDto.setTitle("Estado de la Campaña");
			   contentList.add(dahboardcampaignContentDto1);
			   contentList.add(dahboardcampaignContentDto2);
			   contentList.add(dahboardcampaignContentDto3);
			   
			   dahboardcampaignResponseDto.setHeader(dahboardcampaignHeadersDto);   
		        dahboardcampaignResponseDto.setContent(contentList);
			   
			return ResponseEntity.ok(dahboardcampaignResponseDto);



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

		return new ResponseEntity(respuesta, estatus);

	}
	
	
	@PostMapping("/dashboard/appprocessdisttop10")
	public ResponseEntity<?> appprocessdisttop10Dash(HttpServletRequest request, 
			@RequestBody AppcoverageDashRequestDto tiposfiltros)
			throws ParseException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		
		LabelValueIntegerDto detalleLabelValueDtoestado = new LabelValueIntegerDto();
		LabelValueIntegerDto detalleLabelValueDtoalcance = new LabelValueIntegerDto();
		LabelValueIntegerDto detalleLabelValueDtodistri = new LabelValueIntegerDto();
		DahboardcampaignContentDto dahboardcampaignContentDto1 = new DahboardcampaignContentDto();
		DahboardappprocessdisttopContentDto dahboardappprocessdisttopContentDto = new DahboardappprocessdisttopContentDto();
		DahboardcampaignContentDto dahboardcampaignContentDto2 = new DahboardcampaignContentDto();
		DahboardcampaignContentDto dahboardcampaignContentDto3 = new DahboardcampaignContentDto();
		DahboardcampaignHeadersDto dahboardcampaignHeadersDto = new DahboardcampaignHeadersDto();
		DahboardapptopResponseDto dahboardapptopResponseDto = new DahboardapptopResponseDto();
		DahboardcampaignSection1Dto dahboardcampaignSection1Dto = new DahboardcampaignSection1Dto();
		DahboardcampaignSection1Dto dahboardcampaignSection2Dto = new DahboardcampaignSection1Dto();
		DahboardcampaignSection1Dto dahboardcampaignSection3Dto = new DahboardcampaignSection1Dto();
		List<DahboardcampaignContentDto> dahboardcampaignContentDto1List = new ArrayList();
		
		// ParamsDto detalleParams;
	
		Long cuantosregistro = (long) 0;
		CampaignFormat2Dto detalleCompaing2;

		List<PrivilegesAllDto> 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 idrol;
	
		String contentIn = "";
		int searchStatus = 0;
		int facilityIn = 0;
		int Inunit;
		int idcampana;
		String InPeriodo;
		int RtoMinutes;
		String fechaComoCadena;
		
		Date fecha2 = new Date();
		int iduser; 
		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();
                 iduser = encontreSessionUsuario.get().getId();
				// 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);

				}
				
				Roles roles = encontreSessionUsuario.get().getRolid();
				idrol = roles.getId();
				int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 700);
				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);

				}
				

				 Inunit = tiposfiltros.getUnits();
				 
				 
				 
				 switch (Inunit) { 
				    case 0:  // viene sin busqueda por el like
				    	
				    	String mensaje = "ok";
				    	
				     break;
				  
                     case 1:  // viene sin busqueda por el like
				    	
				    	String mensaje2 = "ok";
				     break;
                        default:
                        	String var2 = "";
                        	boolean bloked = false;
    						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
    						respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado- valor no permitido para la Unidad");
    						estatus=HttpStatus.BAD_REQUEST;   
    						return new ResponseEntity(respuestaDto, estatus);
				    	   
				    	
		         }
				 
				    idcampana = tiposfiltros.getCampaignid();
				 
								

			} 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 SentenciaBase1 = "";
			String SentenciaBase2 = "";
			String SentenciaBase3 = "";
			Query query;
			
			String textCammaping1;
			String textUnits1;
			String textUnits2;
			String textUnits3;
		    //////////////////////comenzamos a armar la primera parte de la salida con el query//////////////estado de los procesos de la evaluacion
  			    if (idcampana==0) {
  			    	 textCammaping1 = " WHERE  (null IS NOT NULL AND c.id = null) OR  (null IS NULL AND (  ";
  			    } else {
  			    		
  			    	textCammaping1 = " WHERE  ( "  + idcampana + " IS NOT NULL AND c.id =  " + idcampana + ") OR  ( " + idcampana + " IS NULL AND (  ";
  			    }
  			    
  			  if (Inunit==0) {
			    	 textUnits1 = " WHERE ep.impactst = 1 AND ep.appst = 1 AND a.status = 1 ";
			    
			    } else {
			    		
			    	textUnits1 = "  WHERE ep.impactst = 1 AND ep.appst = 1 AND a.status = 1 AND uu.userid = " + iduser ;
			    	
			    }
  			    
			SentenciaBase1 = " WITH RankedCampaigns AS ( "
					+ "    SELECT id, "
					+ "           status, "
					+ "           ROW_NUMBER() OVER (ORDER BY dateto DESC) AS campaign_rank "
					+ "    FROM main.campaigns "
					+ "    WHERE DATE_TRUNC('day', dateto) <= CURRENT_DATE "
					+ "), "
					+ "ApplicationCampaignUserCounts AS ( "
					+ "    SELECT a.id AS application_id, "
					+ "           rc.campaign_rank, "
					+ "           COUNT(DISTINCT ep.id) AS total_apariciones "
					+ "    FROM main.applications a "
					+ "    INNER JOIN main.evalprocapps eap ON a.id = eap.applicationid "
					+ "    INNER JOIN main.evalprocesses ep ON eap.evalprocessid = ep.id "
					+ "    INNER JOIN main.unitprocesses up ON ep.unitprocessid = up.id "
					+ "    INNER JOIN main.userunits uu ON up.unitid = uu.unitid "
					+ "    INNER JOIN main.campaignunits cu ON ep.campaignunitid = cu.id "
					+ "    INNER JOIN RankedCampaigns rc ON cu.campaingid = rc.id ";
			SentenciaBase1	=  SentenciaBase1 + textUnits1 + "   GROUP BY a.id,  "
					+ "             rc.campaign_rank "
					+ " ), "
					+ " FirstValidRankPerApp AS ( "
					+ "    SELECT application_id, "
					+ "           MIN(campaign_rank) AS first_valid_rank "
					+ "    FROM ApplicationCampaignUserCounts "
					+ "    GROUP BY application_id "
					+ " ) "
					+ " SELECT a.id AS application_id, "
					+ "       a.name AS application_name, "
					+ "       CAST(COALESCE(acc.total_apariciones, 0) AS INTEGER) AS total_apariciones "
					+ " FROM main.applications a "
					+ " LEFT JOIN FirstValidRankPerApp fvrpa ON a.id = fvrpa.application_id "
					+ " LEFT JOIN ApplicationCampaignUserCounts acc ON fvrpa.application_id = acc.application_id "
					+ "                                       AND fvrpa.first_valid_rank = acc.campaign_rank "
					+ " WHERE a.status = 1 "
					+ "  AND acc.total_apariciones IS NOT NULL "
					+ " ORDER BY total_apariciones DESC "
					+ " LIMIT 10 ";	
			
			
			 //////////////////////fin de armar la primera parte de la salida con el query//////////////estado de los procesos de la evaluacion	
					
			   query = entityManager.createNativeQuery(SentenciaBase1);
			   List<Object[]> listacompleta1 = query.getResultList();
			
			
			   
			     detalleLabelValueDtoestado = new LabelValueIntegerDto();
			
			
				 dahboardcampaignHeadersDto = new DahboardcampaignHeadersDto();
				 dahboardapptopResponseDto = new DahboardapptopResponseDto();
				
				 dahboardappprocessdisttopContentDto = new DahboardappprocessdisttopContentDto();
				 List<DahboardappprocessdisttopContentDto> contentListppprocessdistto = new ArrayList<>();
				 List<LabelValueIntegerDto> estadoEvaluacionList = new ArrayList<>();
		
				  dahboardcampaignContentDto1List = new ArrayList();
				  List<DahboardappprocessdisttopContentDto> contentList2 = new ArrayList<>();
			   int cuantosregistros1 = listacompleta1.size();
			 
			   
			   if (cuantosregistros1>0) {
				   for (Object[] reg : listacompleta1) {	
					   detalleLabelValueDtoestado = new LabelValueIntegerDto();
					   dahboardcampaignContentDto1 = new DahboardcampaignContentDto();
					   dahboardappprocessdisttopContentDto = new DahboardappprocessdisttopContentDto();
					   dahboardcampaignSection1Dto = new DahboardcampaignSection1Dto();
					   
					   detalleLabelValueDtoestado.setLabel((String) reg[1]) ;
					   detalleLabelValueDtoestado.setValue((int) reg[2]);
					   estadoEvaluacionList.add(detalleLabelValueDtoestado);
					   
					   
				    }
				   } 
			   dahboardappprocessdisttopContentDto.setList(estadoEvaluacionList);
				      
			   
			   dahboardcampaignHeadersDto.setTitle("Top 10 de Aplicaciones con Concentración de Procesos");
			   contentList2.add(dahboardappprocessdisttopContentDto);
			
			   
			   dahboardapptopResponseDto.setHeader(dahboardcampaignHeadersDto);   
			   dahboardapptopResponseDto.setContent(contentList2);
			   
			return ResponseEntity.ok(dahboardapptopResponseDto);



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

		return new ResponseEntity(respuesta, estatus);

	}
}
