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>
        /// Busca el indice de la relación periodo del hecho con las columnas generadas
        /// </summary>
        /// <param name="columnas">Lista de columnas que tiene el reporte</param>
        /// <param name="hecho">Objeto EntHecho </param>
        /// <param name="agruparPorUnidad">Por default es "True", permite agrupar por Moneda, si es "False" agrupa por Entidad</param>
        /// <returns></returns>
        private int BuscarIndexColumna(List <EstructuraColumnaReporte> columnas, EntHecho hecho, bool agruparPorUnidad)
        {
            for (int idCol = 0; idCol < columnas.Count; idCol++)
            {
                var columna     = columnas[idCol];
                var unidadHecho = ObtenerNombreColumnaMoneda(hecho, agruparPorUnidad);

                if (columna.Entidad.Equals(hecho.idEntidad))
                {
                    bool coincide = false;
                    switch (hecho.periodo.Tipo)
                    {
                    case Period.Duracion:
                        if ((columna.FechaInicio.Equals(hecho.periodo.FechaInicio) &&
                             columna.FechaFin.Equals(hecho.periodo.FechaFin) && unidadHecho == columna.Moneda))
                        {
                            coincide = true;
                        }
                        break;

                    case Period.Instante:
                        if (columna.FechaInstante.Equals(hecho.periodo.FechaInstante) && unidadHecho == columna.Moneda)
                        {
                            coincide = true;
                        }
                        break;
                    }

                    if (coincide)
                    {
                        if (agruparPorUnidad)
                        {
                            if (columna.Moneda == null)
                            {
                                if (unidadHecho == null)
                                {
                                    return(idCol);
                                }
                            }
                            else
                            {
                                //Si columna tiene unidad y hecho tiene unidad, verificar si son compatibles
                                if (unidadHecho != null)
                                {
                                    return(idCol);
                                }
                            }
                        }
                        else
                        {
                            return(idCol);
                        }
                    }
                }
            }
            return(-1);
        }
        private string ObtenerNombreColumnaMoneda(EntHecho hecho, bool agruparPorUnidad)
        {
            string nombreMoneda  = null;
            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);
                }

                nombreMoneda = "";
                int idx = 0;
                foreach (var numerador in numeradores)
                {
                    if (idx > 0)
                    {
                        nombreMoneda += ", ";
                    }
                    nombreMoneda += numerador.Nombre;
                    idx++;
                }
                if (denominadores.Count > 0)
                {
                    nombreMoneda += " / ";
                }
                idx = 0;
                foreach (var denom in denominadores)
                {
                    if (idx > 0)
                    {
                        nombreMoneda += ", ";
                    }
                    nombreMoneda += denom.Nombre;
                    idx++;
                }
            }
            return(nombreMoneda);
        }