Ejemplo n.º 1
0
        public async Task <IActionResult> DetailsPop(int id, string tipo = "", string mensaje = "")
        {
            ConfiguracionsController configuracionControl = new ConfiguracionsController(db, userManager);
            EvaluacionsController    controlEvaluacion    = new EvaluacionsController(db);
            UnidadesdeMedida         Unidad = new UnidadesdeMedida();

            EjecucionCalculada respuestaFormato = new EjecucionCalculada();

            Ejecucion ejec = await db.Ejecucion.Where(n => n.id == id).FirstOrDefaultAsync();

            if (ejec != null)
            {
                //-------------------------------------------------------identificar si un usuario tiene acceso a editar una ejecucion



                if (User.HasClaim(c => (c.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/Ejecucion.Editar" && c.Value == "1") ||
                                  (c.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/Planeacion.Editar" && c.Value == "1")))
                {
                    ViewBag.MostrarBotonEditarEjecucion = await configuracionControl.PermisoMostrarEditarEjecucion(User, ejec);
                }
                else
                {
                    ViewBag.MostrarBotonEditarEjecucion = false;
                }
                //-------------------------------------------------------identificar si un usuario tiene acceso a editar una ejecucion


                EjecucionCalculada respuesta = new EjecucionCalculada();


                //-------------- generacion de un objeto genérico para manejar los diferentes tipos de indicadores
                ObjectHandle manejador       = Activator.CreateInstance(null, "seguimiento.Formulas." + ejec.Indicador.TipoIndicador.file); //se crea un manejador  op -objeto generico- y un operador generico que permite llamar a las formulas con la cadena del tipo de indiciador: mantenimiento, incremento etc
                Object       op              = manejador.Unwrap();
                Type         t               = op.GetType();
                MethodInfo   operadorPeriodo = t.GetMethod("Calculo_periodo"); //operador es un metodo generico que refleja la funcionalidad de Calculo periodo

                Periodo   periodoLineaBase = db.Periodo.Where(n => n.tipo == "lineabase").FirstOrDefault();
                Ejecucion lineaBase        = db.Ejecucion.Where(n => n.idperiodo == periodoLineaBase.id && n.idindicador == ejec.idindicador).FirstOrDefault();


                List <Evaluacion> evaluaciones = await controlEvaluacion.Get(ejec.idindicador, "Indicador");

                object[] args       = { ejec, null };                                                        //carga los argumentos en un objeto
                var      respuesta2 = (EjecucionCalculada)operadorPeriodo.Invoke(op, args);                  //envia los argumentos mediante invoke al metodo Calculo_periodo
                respuesta        = respuesta2;
                respuestaFormato = controlEvaluacion.SetEvaluacion(Unidad.Formato(respuesta), evaluaciones); //almacena cada ejecucionCalcuada en la lista pero antes ajusta el formato con la clase unidadess de medida


                ViewBag.Adjuntos = await db.EjecucionAdjunto.Where(n => n.idejecucion == ejec.id).ToListAsync();

                ViewBag.tipo    = tipo;
                ViewBag.mensaje = mensaje;
            }
            return(View(respuestaFormato));
        }
        public async Task <IViewComponentResult> InvokeAsync(int itemId = 0)
        {
            EvaluacionsController ControlEvaluacion = new EvaluacionsController(db);


            //--- variables
            List <Indicador> indicadores = new List <Indicador>(); // variable que almacena los indicadores devueltos por la base de datos
            List <object>    listado     = new List <object>();    //variable con toda la informacion a enviar a la vista
            UnidadesdeMedida Unidad      = new UnidadesdeMedida();

            //---------recepcion de parametros
            var idPadre = itemId; //recibe el id padre desde la url


            //-----------consulta los indicadores que pertenecen a esa categoria si no lo logra genera alerta
            indicadores = await db.Indicador.Where(n => n.idCategoria == idPadre).Include(n => n.TipoIndicador).ToListAsync();



            foreach (var indicador in indicadores) // ciclo que se repite para cada indicador encontrado
            {
                //variables para cada indicador
                var ejecuciones = await db.Ejecucion.Where(n => n.idindicador == indicador.id).OrderBy(n => n.Periodo.orden).ToListAsync();

                //var ejecuciones = db.ejecucions.SqlQuery("select * from ejecucions where idindicador = " + indicador.id).ToList();  //Recupera de la base de datos el listado de ejecuciones existentes
                List <object>      listadoEjecuciones  = new List <object>(); //variable con las ejecuciones
                List <object>      listadoParaSubtotal = new List <object>(); //variable con las ejecuciones necesarias para calcular cada subtotal
                List <object>      listadoParaTotal    = new List <object>(); //variable con los subtotales necesarios para calcular el total
                EjecucionCalculada respuesta           = new EjecucionCalculada();
                decimal            lineaBase           = 0;
                string             msg = "";

                //-------------- generacion de un objeto genérico para manejar los diferentes tipos de indicadores
                ObjectHandle manejador        = Activator.CreateInstance(null, "seguimiento.Formulas." + indicador.TipoIndicador.file); //se crea un manejador  op -objeto generico- y un operador generico que permite llamar a las formulas con la cadena del tipo de indiciador: mantenimiento, incremento etc
                Object       op               = manejador.Unwrap();
                Type         t                = op.GetType();
                MethodInfo   operadorPeriodo  = t.GetMethod("Calculo_periodo");  //operador es un metodo generico que refleja la funcionalidad de Calculo periodo
                MethodInfo   operadorSubtotal = t.GetMethod("Calculo_subtotal"); //operador es un metodo generico que refleja la funcionalidad de Calculo subtotal
                MethodInfo   operadorTotal    = t.GetMethod("Calculo_total");    //operador es un metodo generico que refleja la funcionalidad de Calculo total


                //------------------ se definen las evaluaciones a aplicar para cada indicador
                List <Evaluacion> evaluaciones = await ControlEvaluacion.Get(indicador.id, "Indicador");

                foreach (var registro in ejecuciones)
                {
                    switch (registro.Periodo.tipo)
                    {
                    case "periodo":
                        object[] args = { registro, lineaBase };                                                            //carga los argumentos en un objeto
                        respuesta = (EjecucionCalculada)operadorPeriodo.Invoke(op, args);                                   //envia los argumentos mediante invoke al metodo Calculo_periodo
                        listadoEjecuciones.Add(ControlEvaluacion.SetEvaluacion((Unidad.Formato(respuesta)), evaluaciones)); //almacena cada ejecucionCalcuada en la lista pero antes ajusta el formato con la clase unidadess de medida
                        listadoParaSubtotal.Add(respuesta);                                                                 //almacena ejecucón para el calculo del subtotal
                        break;

                    case "subtotal":
                        object[] argsSubtotal = { registro, listadoParaSubtotal, lineaBase };                               //carga los argumentos en un objeto
                        respuesta = (EjecucionCalculada)operadorSubtotal.Invoke(op, argsSubtotal);                          //envia los argumentos mediante invoke al metodo Calculo_subtotal
                        listadoEjecuciones.Add(ControlEvaluacion.SetEvaluacion((Unidad.Formato(respuesta)), evaluaciones)); //almacena cada ejecucionCalcuada en la lista pero antes ajusta el formato con la clase unidadess de medida
                        listadoParaTotal.Add(respuesta);                                                                    //almacena ejecucón para el calculo del subtotal
                        listadoParaSubtotal.Clear();
                        break;

                    case "Total":
                        object[] argstotal = { registro, listadoParaTotal, lineaBase };                                     //carga los argumentos en un objeto
                        respuesta = (EjecucionCalculada)operadorTotal.Invoke(op, argstotal);                                //envia los argumentos mediante invoke al metodo Calculo_total
                        listadoEjecuciones.Add(ControlEvaluacion.SetEvaluacion((Unidad.Formato(respuesta)), evaluaciones)); //almacena cada ejecucionCalcuada en la lista pero antes ajusta el formato con la clase unidadess de medida
                        listadoParaTotal.Clear();
                        break;

                    case "lineabase":

                        var lb = registro.ejecutado;
                        if (lb != null)
                        {
                            lb = lb.Replace("%", "");
                            lb = Regex.Replace(lb, "^-$", "");
                            lb = Regex.Replace(lb, "^_$", "");
                            lb = Regex.Replace(lb, "[a-zA-Z^&()<>//:@#$%;+_!¡]", "");
                        }
                        try { lineaBase = string.IsNullOrEmpty(lb) ? 0 : System.Convert.ToDecimal(lb); }
                        catch (System.OverflowException) { msg = "el valor ejecutado genera desbordamiento"; }
                        catch (System.FormatException) { msg = "el valor ejecutado genera desbordamiento"; }
                        catch (System.ArgumentNullException) { msg = "el valor ejecutado genera desbordamiento"; }



                        object[] argslineabase = { registro, (decimal)10.00 };                     //carga los argumentos en un objeto
                        respuesta = (EjecucionCalculada)operadorPeriodo.Invoke(op, argslineabase); //envia los argumentos mediante invoke al metodo Calculo_periodo
                        listadoEjecuciones.Add(Unidad.Formato(respuesta));                         //almacena cada ejecucionCalcuada en la lista

                        break;

                    default:

                        object[] argsotros = { registro, (decimal)10.00 };                     //carga los argumentos en un objeto
                        respuesta = (EjecucionCalculada)operadorPeriodo.Invoke(op, argsotros); //envia los argumentos mediante invoke al metodo Calculo_periodo
                        listadoEjecuciones.Add(Unidad.Formato(respuesta));                     //almacena cada ejecucionCalcuada en la lista

                        break;
                    }
                }

                object[] indicadorConejecuciones = { indicador, listadoEjecuciones }; //objeto que unifica los datos del inidcaodr y sus ejecuciones
                listado.Add(indicadorConejecuciones);                                 //almacena el indicador y las ejecuciuones en el listado a enviar a la vista
            }
            ViewBag.listado = listado;
            return(View());
        }