public JsonResult Inspecciones([Bind(Include = "zona,linea,edad,a_o_s,listaFactores,selectGrados,valoresFR,selectGradosPatologia,listaPatologias,listaFactores")] ConsultaInspecciones consulta)
        {
            List<ApoyosZonas> listaApoyosZonas = db.ApoyosZonas.Where(m => m.ul_inspeccion != null).ToList();
            List<ApoyoLista> listTemp = new List<ApoyoLista>();
            List<ApoyoLista> listaApoyosLista = db.ApoyoLista.Where(m => m.ul_inspeccion != null).ToList();
            List<ApoyoLista> retorno = new List<ApoyoLista>();
            List<Patologias> insPat = new List<Patologias>();
            //Id del Grado Proximidad con valor 0
            string valor0 = db.Grados_Proximidad.First(m => m.activo == true && m.valor == 0).id;

            List<string> gradosFR = new List<string>();
            List<Factores_Riesgo> listaNuevaFR = new List<Factores_Riesgo>();

            if ( consulta.valoresFR != null && consulta.valoresFR.Count > 0) {
               listaNuevaFR = db.Factores_Riesgo.Where(item => consulta.valoresFR.Contains(item.id)).ToList();           

                foreach(Factores_Riesgo e in listaNuevaFR){
                    gradosFR.Add("TODAS");            
                }
         

                int psFR = 0;
                foreach(string e in consulta.selectGrados){
                    if(e != valor0){
                        string id = db.Grados_Proximidad.SingleOrDefault(m => m.id == e).valor.ToString();
                        gradosFR.Add(id);
                        id = consulta.listaFactores.ToArray()[psFR];
                        Factores_Riesgo introFR = db.Factores_Riesgo.SingleOrDefault(m => m.id == id);
                        listaNuevaFR.Add(introFR);
                    }
                    psFR++;
                }
            }



            List<string> gradosPat = new List<string>();
            int ps = 0;

            foreach (string f in consulta.selectGradosPatologia) { 
            
            int val = int.Parse(f);
                if (val != 0)
                {
                    string idPatologia = consulta.listaPatologias.ToArray()[ps];
                    Patologias retornarPat = db.Patologias.SingleOrDefault(m => m.id == idPatologia);
                    insPat.Add(retornarPat);

                    gradosPat.Add(f);
                }
                ps++;
            }

            List<string> criterios = new List<string>();
            try
            {

                //Compruebo Zona
                if (String.IsNullOrEmpty(consulta.zona) != true)
                {
                    listaApoyosZonas = listaApoyosZonas.Where(m => m.id_zona == consulta.zona).ToList();
                    var zon = db.ZonasLista.SingleOrDefault(m => m.id == consulta.zona);

                    List<string> idsApoyos = listaApoyosZonas.Select(m => m.id_apoyo).Distinct().ToList();

                    //retorno = db.ApoyoLista.Where(s => idsApoyos.Any(f => f == s.id)).ToList();                   
                    //foreach (string i in idsApoyos)
                    //{
                    //    ApoyoLista nuevo = db.ApoyoLista.SingleOrDefault(m => m.id == i);
                    //    retorno.Add(nuevo);
                    //}
                    retorno = db.ApoyoLista.Where(item => idsApoyos.Contains(item.id) && item.ul_inspeccion != null).ToList();
                    //retorno = retorno.Where(m => m.ul_inspeccion != null).ToList();

                    criterios.Add(zon.nombre);
                }
                else
                {
                    criterios.Add("TODAS");

                    retorno = db.ApoyoLista.Where(m=>m.ul_inspeccion != null).ToList();
                }



                //Compruebo Línea
                if (String.IsNullOrEmpty(consulta.linea) != true)
                {
                    var line = db.Lineas.SingleOrDefault(m => m.id == consulta.linea);
                    retorno = retorno.Where(m => m.linea == consulta.linea).ToList();            
                    criterios.Add(line.nombre);
                }
                else
                {
                    criterios.Add("TODAS");
                }

                //Compruebo Edad
                if( consulta.edad !=0){

                    int edad = DateTime.Now.Year - consulta.edad;
                    retorno = retorno.Where(m => m.ano_actual == edad.ToString()).ToList();
                    criterios.Add(consulta.edad.ToString());
                }
                else
                {
                    criterios.Add("TODAS");
                }

                //Compruebo Amarre o Supención
                if (String.IsNullOrEmpty(consulta.a_o_s) != true)
                {
                    if (consulta.a_o_s == "0")
                    {
                        retorno = retorno.Where(m => m.amarre == true).ToList();                       
                        criterios.Add("SÍ");
                        criterios.Add("NO");
                    }
                    else {
                        retorno = retorno.Where(m => m.sustentacion == true).ToList();
                        criterios.Add("NO");
                        criterios.Add("SÍ");            
                    }
                }
                else
                {
                    criterios.Add("NO"); 
                    criterios.Add("NO");
                }

                
                int valoresFactoresR = consulta.selectGrados.Where(m => m != valor0).Count();
                int valoresPatologias = consulta.selectGradosPatologia.Where(m => m != "0").Count();

                //Recorro Apoyos 
                foreach(ApoyoLista e in retorno){
                    bool comprob = true;
                    int posicion = 0;

                    List<InspeccionesValores> InspeccionesValores = db.InspeccionesValores.Where(m => m.id_inspeccion == e.ul_inspeccion && m.gpr != valor0).ToList();

                    //Recorro factores de riesgo con checkbox
                    if (consulta.valoresFR != null && consulta.valoresFR.Count > 0)
                    {
                      foreach (string va in consulta.valoresFR)
                        {
                         InspeccionesValores ValoresTotales = InspeccionesValores.SingleOrDefault(m => m.factor_riesgo == va);

                            if (ValoresTotales != null)
                            {
                                comprob = true;
                            }
                            else
                            {
                                comprob = false;
                                break;
                            }

                        }
                    }


                    //Recorro Anomalías
                    if (comprob && valoresPatologias > 0)
                    {
                        int posiPa = 0; 
             
               List<InspeccionPatologias> insPato = db.InspeccionPatologias.Where(m => m.idinspeccion == e.ul_inspeccion&&m.valor !=0).ToList();

                        foreach(string pa in consulta.selectGradosPatologia){                   
                            int val = int.Parse(pa);
                            if(val !=0){
                                string idPatologia = consulta.listaPatologias.ToArray()[posiPa];
                                List<InspeccionPatologias> listPaTem = insPato.Where(m => m.idpatologia == idPatologia && m.valor == val).ToList();

                                if (listPaTem != null && listPaTem.Count > 0)
                                {
                                    comprob = true;
                                }
                                else {
                                    comprob = false;
                                    break;
                                }                            
                            }
                            posiPa++;
                        }
                    }


                    //Recorro factores de riesgo con select
                    if (comprob && valoresFactoresR > 0)
                    {
                        foreach (string p in consulta.selectGrados)
                                {
                                    if (p != valor0)
                                    {
                                        string fr = consulta.listaFactores.ToArray()[posicion];
                         InspeccionesValores ins = InspeccionesValores.SingleOrDefault(m => m.factor_riesgo == fr && m.gpr == p);

                                        if (ins != null)
                                        {
                                            comprob = true;
                                        }
                                        else
                                        {
                                            comprob = false;
                                            break;
                                        }
                                    }
                                    posicion++;
                                }
                     }
                            
                     if(comprob){

                                ApoyoLista intro = db.ApoyoLista.First(m => m.id == e.id);                                
                                listTemp.Add(intro); 
                            }      
                }
                retorno = listTemp;

                ExportPDF exportar = new ExportPDF();
                exportar.ConsultaInspecciones(retorno.OrderBy(m => m.linea_n).ToList(), User.Identity.GetUserId(), "RESULTADO_CONSULTA_INSPECCIONES", "RESULTADO CONSULTA DE INSPECCIONES", criterios, insPat, gradosPat, listaNuevaFR, gradosFR);

                RetornarDatosConsulta retornar = new RetornarDatosConsulta();
                retornar.listaApoyos = retorno.OrderBy(m => m.linea_n).ToList();
                retornar.exel = new ExportXSL().ExportarConsultaAnomalias(retorno.OrderBy(m => m.linea_n).ToList());


                string json = JsonConvert.SerializeObject(retornar);
                return new System.Web.Mvc.JsonResult()
                {
                    Data = json,
                    MaxJsonLength = 1073741824,
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }//Fin try
            catch (Exception e)
            {
                return new System.Web.Mvc.JsonResult()
                {
                    Data = "Error al realizar la consulta",
                    MaxJsonLength = 1073741824,
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };

            }//Fin catch
        }
        public JsonResult Anomalias(int grado, string anomalia, string linea, string zona)
        {
            List<ApoyoLista> listaApoyos = db.ApoyoLista.Where(m => m.ul_inspeccion != null).ToList();
            List<ApoyosZonas> listaApoyosZonas = db.ApoyosZonas.Where(m => m.ul_inspeccion != null).ToList();
            List<ApoyosZonas> listTemp = new List<ApoyosZonas>();
            List<ApoyoLista> retorno = new List<ApoyoLista>();
            List<string> criterios = new List<string>();
            var anoma = db.Patologias.SingleOrDefault(m=>m.id == anomalia);

            criterios.Add(anoma.nombre);
            criterios.Add(grado.ToString());

            try
            {
                if (String.IsNullOrEmpty(linea) != true)
                {
                    var line = db.Lineas.SingleOrDefault(m => m.id == linea);
                    listTemp = listaApoyosZonas.Where(m => m.id_linea == linea).ToList();
                    listaApoyosZonas = listTemp;
                    criterios.Add(line.nombre);
                }
                else {
                    criterios.Add("TODAS");                
                }

                if (String.IsNullOrEmpty(zona) != true)
                {
                    listTemp = listaApoyosZonas.Where(m => m.id_zona == zona).ToList();
                    listaApoyosZonas = listTemp;
                    var zon = db.ZonasLista.SingleOrDefault(m=>m.id == zona);
                    criterios.Add(zon.nombre);
                }
                else
                {
                    criterios.Add("TODAS");
                }

                List<string> ids_Inspecciones = listaApoyosZonas.Select(m => m.ul_inspeccion).Distinct().ToList();
                List<InspeccionPatologias> listaInspeccionPatologias = new List<InspeccionPatologias>();

                if (grado == 0)
                {
                    listaInspeccionPatologias = db.InspeccionPatologias.Where(m => m.valor == 0).ToList();
                }
                if (grado == 1)
                {
                    listaInspeccionPatologias = db.InspeccionPatologias.Where(m => m.valor == 1).ToList();
                }
                if (grado == 2)
                {
                    listaInspeccionPatologias = db.InspeccionPatologias.Where(m => m.valor == 2).ToList();
                }
                


                foreach (string ins in ids_Inspecciones)
                {
                    if (listaInspeccionPatologias.Where(m => m.idinspeccion == ins && m.idpatologia == anomalia && m.valor == grado).Count() > 0)
                    {
                        retorno.Add(listaApoyos.First(m=>m.ul_inspeccion == ins));                    
                    }                    

                }
                
                ExportPDF exportar = new ExportPDF();
                exportar.Consultas(retorno.OrderBy(m => m.linea_n).ToList(),User.Identity.GetUserId(),"RESULTADO_CONSULTA_ANOMALÍA","RESULTADO CONSULTA DE ANOMAlÍAS",criterios);

                RetornarDatosConsulta retornar = new RetornarDatosConsulta();
                retornar.listaApoyos = retorno.OrderBy(m => m.linea_n).ToList();
                retornar.exel = new ExportXSL().ExportarConsultaAnomalias(retorno.OrderBy(m => m.linea_n).ToList());

                string json = JsonConvert.SerializeObject(retornar);

                return new System.Web.Mvc.JsonResult()
                {
                    Data = json,
                    MaxJsonLength = 1073741824,
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };

            }

            catch (Exception e)
            {
                return new System.Web.Mvc.JsonResult()
                {
                    Data = "Error al realizar la consulta",
                    MaxJsonLength = 1073741824,
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
              
            }

        }
        public JsonResult Riesgos([Bind(Include = "riesgos,comparaciones,valores")] ConsultaRiesgos consulta)
        {            
            List<ApoyoLista> retorno = new List<ApoyoLista>();

            try
            {
                List<string> idsApoyos = new List<string>();
                List<string> criteriosRiesgos = new List<string>();
                List<string> criteriosComparaciones = new List<string>();
                List<string> criteriosValores = new List<string>();

               IQueryable<IGrouping<string, KRiesgo>> valores_riesgos = db.KRiesgo.GroupBy(z => z.id_apoyo);
               int posC = 0;
                foreach(string e in consulta.comparaciones){

                    if (String.IsNullOrEmpty(e) != true && String.IsNullOrEmpty(consulta.valores.ToArray()[posC]) != true)
                    {
                        string idR = consulta.riesgos.ToArray()[posC];
                        string valorC = consulta.valores.ToArray()[posC];
                        string v ="";
                        if(e=="1"){
                            v = "MAYOR";
                        }
                        if (e == "2")
                        {
                            v = "MENOR";
                        }
                        if (e == "3")
                        {
                            v = "IGUAL";
                        }

                        criteriosComparaciones.Add(v);
                        criteriosRiesgos.Add(consulta.listaRiesgos.First(m => m.Value == idR).Text);
                        criteriosValores.Add(valorC);                    
                    }

                    posC++;
                }
              

                foreach(IGrouping<string, KRiesgo> k in valores_riesgos){
                    int pos = 0;
                    bool comparacion = false;

                    foreach(string e in consulta.comparaciones){

                        string idR = consulta.riesgos.ToArray()[pos];
                        string valorC = consulta.valores.ToArray()[pos];

                        if (String.IsNullOrEmpty(e) != true && String.IsNullOrEmpty(valorC) != true)
                        {


                        double val = double.Parse(valorC);

                        if(e=="1")
                        {
                            var result = k.FirstOrDefault(m => m.id_riesgo == idR && m.valor > val);

                            if (result == null)
                            {
                                comparacion = false;
                                break;
                            }
                            else {
                                comparacion = true;
                            }
                        
                        }

                        else if (e == "2")
                        {
                            var result = k.FirstOrDefault(m => m.id_riesgo == idR && m.valor < val);

                            if (result == null)
                            {
                                comparacion = false;
                                break;
                            }
                            else
                            {
                                comparacion = true;
                            }

                        }
                        else if (e == "3")
                        {
                            var result = k.FirstOrDefault(m => m.id_riesgo == idR && m.valor == val);

                            if (result == null)
                            {
                                comparacion = false;
                                break;
                            }
                            else
                            {
                                comparacion = true;
                            }

                        }                   
                    
                    }
                    pos++;
                }//Fin forEach 2

                    if (comparacion) {

                        idsApoyos.Add(k.Key);
                    
                    }



                }//Fin forEach 1

                retorno = db.ApoyoLista.Where(item => idsApoyos.Contains(item.id)).ToList();

                ExportPDF exportar = new ExportPDF();
                exportar.ConsultaRiesgos(retorno.OrderBy(m => m.linea_n).ToList(), User.Identity.GetUserId(), "RESULTADO_CONSULTA_RIESGOS", "RESULTADO CONSULTA DE RIESGOS",criteriosRiesgos,criteriosComparaciones,criteriosValores);

                RetornarDatosConsulta retornar = new RetornarDatosConsulta();
                retornar.listaApoyos = retorno.OrderBy(m => m.linea_n).ToList();
                retornar.exel = new ExportXSL().ExportarConsultaAnomalias(retorno.OrderBy(m => m.linea_n).ToList());

                string json = JsonConvert.SerializeObject(retornar);
                return new System.Web.Mvc.JsonResult()
                {
                    Data = json,
                    MaxJsonLength = 1073741824,
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }//Fin try
            catch (Exception e)
            {
                return new System.Web.Mvc.JsonResult()
                {
                    Data = "Error al realizar la consulta",
                    MaxJsonLength = 1073741824,
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };

            }//Fin catch
        }
        public ActionResult GestionEconomicaInspecciones()
        {
            List<GestionEconomicaInspecciones> retorno = db.GestionEconomicaInspecciones.ToList();
            ExportPDF exportar = new ExportPDF();
            exportar.ExportGestionEconomicaInspecciones(retorno, User.Identity.GetUserId(), "GESTION_ECONOMICA_INSPECCIONES", "GESTIÓN ECONÓMICA DE INSPECCIONES");

            return View(retorno);
        }