/// <summary>
        /// Obtiene los ultimos tres reportes trimestrales IFRS enviados.
        /// </summary>
        /// <param name="abaxXBRLBlockStore"></param>
        /// <param name="claveEmisora"></param>
        /// <returns></returns>
        public static List <Envio> ObtenerUlrimosTresReportesTrimestralesIFRS(IAbaxXBRLCellStoreMongo abaxXBRLBlockStore, String claveEmisora)
        {
            List <Envio> enviosIFRS = new List <Envio>();

            Dictionary <String, object> parametros = new Dictionary <string, object>();

            parametros.Add("'Entidad.Nombre'", claveEmisora);
            parametros.Add("Taxonomia", "{$regex: 'ifrs'}");
            parametros.Add("EsVersionActual", "true");

            var parametrosConsulta = GenerarCadenaParametrosConsulta(parametros);

            enviosIFRS = abaxXBRLBlockStore.ConsultaElementos <Envio>("Envio", parametrosConsulta).ToList();

            if (enviosIFRS != null && enviosIFRS.Count > 0)
            {
                enviosIFRS = enviosIFRS.OrderByDescending(x => x.FechaRecepcion).ToList();
            }

            if (enviosIFRS != null && enviosIFRS.Count >= 3)
            {
                return(enviosIFRS.GetRange(0, 3));
            }

            return(enviosIFRS);
        }
        /// <summary>
        /// Obtiene la lista de hechos IFRS.
        /// </summary>
        /// <param name="abaxXBRLBlockStore"></param>
        /// <param name="envio"></param>
        /// <returns></returns>
        public static List <Hecho> ObtenerHechosIFRS(IAbaxXBRLCellStoreMongo abaxXBRLBlockStore, Envio envio)
        {
            List <Hecho> listaHechos = new List <Hecho>();

            if (envio != null)
            {
                Dictionary <String, object> parametros = new Dictionary <string, object>();
                parametros.Add("'Entidad.Nombre'", "'" + envio.Entidad.Nombre + "'");
                parametros.Add("IdEnvio", "'" + envio.IdEnvio + "'");
                parametros.Add("'Concepto.IdConcepto'", "{$in : ['" + String.Join("','", ID_CONCEPTOS_IFRS) + "']}");
                var parametrosConsulta = GenerarCadenaParametrosConsulta(parametros);
                listaHechos = abaxXBRLBlockStore.ConsultaElementos <Hecho>("Hecho", parametrosConsulta).ToList();
            }
            return(listaHechos);
        }
        /// <summary>
        /// Obtiene el utlimo envio trimestral 4D de IFRS de la emisora.
        /// </summary>
        /// <param name="claveEmisora"></param>
        /// <param name="abaxXBRLBlockStore"></param>
        /// <returns></returns>
        public static Envio ObtenerUltimoEnviosIFRS(String claveEmisora, IAbaxXBRLCellStoreMongo abaxXBRLBlockStore)
        {
            Envio envioIFRS = null;

            Dictionary <String, object> parametros = new Dictionary <string, object>();

            parametros.Add("'Entidad.Nombre'", claveEmisora);
            parametros.Add("Taxonomia", "{$regex: 'ifrs'}");
            parametros.Add("EsVersionActual", "true");
            parametros.Add("'Parametros.Dictaminado'", "'true'");
            parametros.Add("'Parametros.trimestre'", "'4D'");

            var          parametrosConsulta = GenerarCadenaParametrosConsulta(parametros);
            List <Envio> listaEnvios        = abaxXBRLBlockStore.ConsultaElementos <Envio>("Envio", parametrosConsulta).ToList();

            if (listaEnvios != null && listaEnvios.Count > 0)
            {
                listaEnvios = listaEnvios.OrderByDescending(x => x.Periodo.Ejercicio).ToList();
                envioIFRS   = listaEnvios.ElementAt(0);
            }

            return(envioIFRS);
        }
        /// <summary>
        /// Obtiene los últimos 5 eventos relevantes por sector.
        /// </summary>
        /// <param name="listaEmisoras"></param>
        /// <param name="abaxXBRLBlockStore"></param>
        /// <returns></returns>
        public static List <List <Hecho> > ObtenerUltimosSincoEventosRelevantesDelSector(String[] listaEmisoras, IAbaxXBRLCellStoreMongo abaxXBRLBlockStore)
        {
            List <List <Hecho> > ulimosSincoEventosRelevantesDelSector = new List <List <Hecho> >();

            var parametrosConsultaEnviosEventosRelevantes = "{ 'Entidad.Nombre' : { $in: [";

            foreach (var claveEmisora in listaEmisoras)
            {
                parametrosConsultaEnviosEventosRelevantes += "'" + claveEmisora + "' ,";
            }

            parametrosConsultaEnviosEventosRelevantes = parametrosConsultaEnviosEventosRelevantes.Remove(parametrosConsultaEnviosEventosRelevantes.LastIndexOf(","), 1);

            parametrosConsultaEnviosEventosRelevantes += "]}, ";

            parametrosConsultaEnviosEventosRelevantes += "Taxonomia: { $in: [" + TAXOS_ER + "]}, ";
            parametrosConsultaEnviosEventosRelevantes += "EsVersionActual: true";
            parametrosConsultaEnviosEventosRelevantes += "}";

            var listaEnviosEventosRelevantesEmisoras = abaxXBRLBlockStore.ConsultaElementos <Envio>("Envio", parametrosConsultaEnviosEventosRelevantes);

            var parametrosConsultaHechosEventosRelevantes = "{ 'Concepto.IdConcepto': { $in : ['" + ID_CONCEPTO_EVENTO_RELEVANTE + "', '" + ID_CONCEPTO_FECHA_EVENTO_RELEVANTE + "'] } , IdEnvio: { $in: [";

            var entroEnvios = false;

            foreach (var envio in listaEnviosEventosRelevantesEmisoras)
            {
                parametrosConsultaHechosEventosRelevantes += "'" + envio.IdEnvio + "',";
                entroEnvios = true;
            }

            if (entroEnvios)
            {
                parametrosConsultaEnviosEventosRelevantes  = parametrosConsultaEnviosEventosRelevantes.Remove(parametrosConsultaEnviosEventosRelevantes.LastIndexOf(","), 1);
                parametrosConsultaHechosEventosRelevantes += "] }";
                parametrosConsultaHechosEventosRelevantes += "}";
            }

            var listaHechosEventosRelevantesEmisoras = abaxXBRLBlockStore.ConsultaElementos <Hecho>("Hecho", parametrosConsultaEnviosEventosRelevantes);

            var hechosAgrupadosPorEnvio = listaHechosEventosRelevantesEmisoras.ToList().GroupBy(hecho => hecho.IdEnvio).Select(grp => grp.ToList()).ToList();

            hechosAgrupadosPorEnvio.OrderBy(lista => lista.Find(hecho => hecho.Concepto.IdConcepto.Equals(ID_CONCEPTO_FECHA_EVENTO_RELEVANTE)).Valor);

            if (hechosAgrupadosPorEnvio.Count() > 0)
            {
                if (hechosAgrupadosPorEnvio.Count() >= 5)
                {
                    ulimosSincoEventosRelevantesDelSector = hechosAgrupadosPorEnvio.GetRange(0, 5);
                }
                else
                {
                    ulimosSincoEventosRelevantesDelSector = hechosAgrupadosPorEnvio.GetRange(0, hechosAgrupadosPorEnvio.Count());
                }
            }

            return(ulimosSincoEventosRelevantesDelSector);
        }
        /// <summary>
        /// Obtiene los hechos del Reporte Anual.
        /// </summary>
        /// <param name="parametrosConsulta"></param>
        /// <param name="abaxXBRLBlockStore"></param>
        /// <returns></returns>
        public static IList <Hecho> ObtenerHechosReporteAnual(String parametrosConsulta, IAbaxXBRLCellStoreMongo abaxXBRLBlockStore)
        {
            IList <Hecho> listaHechosReporteAnual = new List <Hecho>();

            listaHechosReporteAnual = abaxXBRLBlockStore.ConsultaElementos <Hecho>("Hecho", parametrosConsulta);
            return(listaHechosReporteAnual);
        }
        public static String[] EnvioPorFecha(String ticker, String trimestre, int anio, ObjetoFecha[] fechas, IAbaxXBRLCellStoreMongo AbaxXBRLCellStoreMongo)
        {
            String[] envioPorFecha = new String[4];

            for (var i = 0; i < 4; i++)
            {
                var parametroTrimestreEnvio = "";

                if (i == 0 || i == 1)
                {
                    parametroTrimestreEnvio = " $or: [ {'Parametros.trimestre': '4D'}, {'Parametros.trimestre': '4'} ]";
                }
                else
                {
                    parametroTrimestreEnvio = "'Parametros.trimestre': '" + trimestre + "'";
                }

                var parametrosEnvio = "{'Entidad.Nombre': '" + ticker + "', Taxonomia: {$regex: 'ifrs'}, 'Parametros.Ano':'" + fechas[i].FechaFin.Substring(0, 4) + "'," + parametroTrimestreEnvio + "}";

                List <Envio> envios = AbaxXBRLCellStoreMongo.ConsultaElementos <CellStore.Modelo.Envio>("Envio", parametrosEnvio).ToList();

                Envio envio = new Envio();

                if (envios != null && envios.Count > 0)
                {
                    envios = envios.OrderByDescending(envio1 => envio1.Parametros["trimestre"].ToString()).ToList();
                    envio  = envios.ElementAt(0);
                }
                else
                {
                    if (i == 0 || i == 1)
                    {
                        parametrosEnvio = "{'Entidad.Nombre': '" + ticker + "', Taxonomia: {$regex: 'ifrs'}, 'Parametros.Ano':'" + (Convert.ToInt32(fechas[i].FechaFin.Substring(0, 4)) + 1).ToString() + "'," + parametroTrimestreEnvio + "}";
                        envios          = AbaxXBRLCellStoreMongo.ConsultaElementos <CellStore.Modelo.Envio>("Envio", parametrosEnvio).ToList();
                        if (envios != null && envios.Count > 0)
                        {
                            envios = envios.OrderByDescending(envio1 => envio1.Parametros["trimestre"].ToString()).ToList();
                            envio  = envios.ElementAt(0);
                        }
                    }
                }

                envioPorFecha[i] = envio.IdEnvio;
            }

            return(envioPorFecha);
        }