/// <summary>
        /// Ordenacion de las columnas del reporte
        /// </summary>
        /// <param name="estructuraDeColumnas">Lista de columnas generadas en la estructura</param>
        /// <returns></returns>
        public static List <EstructuraColumnaReporte> OrdenarFechaDeColumnas(List <EstructuraColumnaReporte> estructuraDeColumnas)
        {
            List <EstructuraColumnaReporte> listaEstructuraDeColumnas = new List <EstructuraColumnaReporte>();
            List <DateTime> listaFechas = new List <DateTime>();

            var ordenamientoFechas = from l in estructuraDeColumnas
                                     orderby l.FechaInstante descending, l.FechaInicio descending
            select l;

            foreach (var elementoOrdenado in ordenamientoFechas)
            {
                EstructuraColumnaReporte estructuraColumnaReporte = new EstructuraColumnaReporte();

                estructuraColumnaReporte.Entidad        = elementoOrdenado.Entidad;
                estructuraColumnaReporte.EsquemaEntidad = elementoOrdenado.EsquemaEntidad;
                estructuraColumnaReporte.FechaFin       = elementoOrdenado.FechaFin;
                estructuraColumnaReporte.FechaInicio    = elementoOrdenado.FechaInicio;
                estructuraColumnaReporte.FechaInstante  = elementoOrdenado.FechaInstante;
                estructuraColumnaReporte.Moneda         = elementoOrdenado.Moneda;
                estructuraColumnaReporte.MonedaId       = elementoOrdenado.MonedaId;
                estructuraColumnaReporte.NombreColumna  = elementoOrdenado.NombreColumna;
                estructuraColumnaReporte.TipoDePeriodo  = elementoOrdenado.TipoDePeriodo;

                listaEstructuraDeColumnas.Add(estructuraColumnaReporte);
            }
            return(listaEstructuraDeColumnas);
        }
        private bool HechoPerteneceAColumna(EntHecho hecho, EstructuraColumnaReporte columna, bool agruparPorUnidad)
        {
            if (!columna.Entidad.Equals(hecho.idEntidad))
            {
                return(false);
            }

            switch (hecho.periodo.Tipo)
            {
            case Period.Duracion:
                if (!(columna.FechaInicio.Equals(hecho.periodo.FechaInicio) && columna.FechaFin.Equals(hecho.periodo.FechaFin) &&
                      ObtenerNombreColumnaMoneda(hecho, agruparPorUnidad) == columna.Moneda))
                {
                    return(false);
                }
                break;

            case Period.Instante:
                if (!(columna.FechaInstante.Equals(hecho.periodo.FechaInstante) &&
                      ObtenerNombreColumnaMoneda(hecho, agruparPorUnidad) == columna.Moneda))
                {
                    return(false);
                }
                break;
            }

            /*if (agruparPorUnidad)
             * {
             *  if (String.IsNullOrEmpty(columna.Moneda))
             *  {
             *      return false;
             *  }
             * }*/
            return(true);
        }
        private EstructuraColumnaReporte CrearColumnaEncabezado(EntHecho hecho, bool agruparPorUnidad)
        {
            EstructuraColumnaReporte columnasEncabezado = new EstructuraColumnaReporte();

            columnasEncabezado.FechaInicio    = (hecho.periodo.FechaInicio != null ? hecho.periodo.FechaInicio.Value : DateTime.Now);
            columnasEncabezado.FechaFin       = (hecho.periodo.FechaFin != null ? hecho.periodo.FechaFin.Value : DateTime.Now);
            columnasEncabezado.FechaInstante  = (hecho.periodo.FechaInstante != null ? hecho.periodo.FechaInstante.Value : DateTime.Now);
            columnasEncabezado.Entidad        = hecho.idEntidad;
            columnasEncabezado.EsquemaEntidad = hecho.idEntidad;
            columnasEncabezado.TipoDePeriodo  = hecho.periodo.Tipo;

            var numeradores   = new List <EntMedida>();
            var denominadores = new List <EntMedida>();

            if (hecho.unidades != null && agruparPorUnidad)
            {
                if (hecho.unidades.Medidas != null)
                {
                    numeradores.AddRange(hecho.unidades.Medidas);
                }

                if (hecho.unidades.MedidasNumerador != null)
                {
                    denominadores.AddRange(hecho.unidades.MedidasNumerador);
                }

                columnasEncabezado.Moneda = "";
                int idx = 0;
                foreach (var numerador in numeradores)
                {
                    if (idx > 0)
                    {
                        columnasEncabezado.Moneda += ", ";
                    }
                    columnasEncabezado.Moneda += numerador.Nombre;
                    idx++;
                }
                if (denominadores.Count > 0)
                {
                    columnasEncabezado.Moneda += " / ";
                }
                idx = 0;
                foreach (var denom in denominadores)
                {
                    if (idx > 0)
                    {
                        columnasEncabezado.Moneda += ", ";
                    }
                    columnasEncabezado.Moneda += denom.Nombre;
                    idx++;
                }
            }
            else
            {
                columnasEncabezado.Moneda = null;
            }
            return(columnasEncabezado);
        }
        /// <summary>
        /// Valdia que la estructura de una columna sea igual respecto a la emisora y unidad
        /// </summary>
        /// <param name="columna">Columna base para comparar</param>
        /// <param name="columnaCompara">Columna que se debe de comparar</param>
        /// <returns>En el caso que sean iguales regresa true</returns>
        private bool validarIgualdad(EstructuraColumnaReporte columna, EstructuraColumnaReporte columnaCompara)
        {
            var SonIguales = false;

            if (columna.FechaFin.Equals(columnaCompara.FechaInstante))
            {
                if (columna.EsquemaEntidad.Equals(columnaCompara.EsquemaEntidad))
                {
                    if (columna.Moneda == columnaCompara.Moneda)
                    {
                        SonIguales = true;
                    }
                }
            }

            return(SonIguales);
        }
        /// <summary>
        /// Por cada columna se genera un formato de cadena de las fechas dependiendo del tipo de periodo
        /// </summary>
        /// <param name="columna">Objeto que contiene la informacion para la creacion de la columnas del reporte</param>
        /// <returns></returns>
        private string GenerarEncabezadoFecha(EstructuraColumnaReporte columna)
        {
            string tituloFecha = string.Empty;

            switch (columna.TipoDePeriodo)
            {
            case Period.Instante:
                tituloFecha = AbaxXBRLCore.Common.Util.DateUtil.ToFormatString(columna.FechaInstante.ToUniversalTime(), AbaxXBRLCore.Common.Util.DateUtil.YMDateFormat);
                break;

            case Period.Duracion:
                tituloFecha = AbaxXBRLCore.Common.Util.DateUtil.ToFormatString(columna.FechaInicio.ToUniversalTime(), AbaxXBRLCore.Common.Util.DateUtil.YMDateFormat) +
                              ConstantesGenerales.Underscore_String
                              + AbaxXBRLCore.Common.Util.DateUtil.ToFormatString(columna.FechaFin.ToUniversalTime(), AbaxXBRLCore.Common.Util.DateUtil.YMDateFormat);
                break;

            case Period.ParaSiempre:
                tituloFecha = "Para Siempre";
                break;
            }
            return(tituloFecha);
        }