/// <summary>
        /// Busca uno o mas hechos que correspondan con los filtros enviados como parámetro.
        /// Si un filtro es nulo entonces no se considera para filtrar al hecho
        /// </summary>
        /// <param name="idConcepto">Identificador del concepto buscad</param>
        /// <param name="entidad">Entidad a considerar del concepto</param>
        /// <param name="unidad">Unidad buscada del hecho</param>
        /// <param name="fechaInicio">Fecha posible de inicio</param>
        /// <param name="fechaFin">Fecha posible de fin</param>
        /// <param name="valoresDimensiones">Valores dimensionales a considerar</param>
        /// <param name="considerarDimensiones">Indica si se deben de considerar o no las dimensiones para buscar un hecho</param>
        /// <returns>Lista de hechos que corresponden con la búsqueda</returns>
        public IList <HechoDto> BuscarHechos(string idConcepto, EntidadDto entidad, UnidadDto unidad, DateTime fechaInicio, DateTime fechaFin, IList <DimensionInfoDto> valoresDimensiones,
                                             bool considerarDimensiones = true)
        {
            IList <HechoDto> hechosResultado = new List <HechoDto>();

            foreach (var listaHechos in HechosPorIdConcepto.Where(x => x.Key.Equals(idConcepto)))
            {
                foreach (var idHecho in listaHechos.Value)
                {
                    var hecho       = HechosPorId[idHecho];
                    var contexto    = ContextosPorId.ContainsKey(hecho.IdContexto) ? ContextosPorId[hecho.IdContexto] : null;
                    var unidadHecho = !String.IsNullOrEmpty(hecho.IdUnidad) && UnidadesPorId.ContainsKey(hecho.IdUnidad) ? UnidadesPorId[hecho.IdUnidad] : null;
                    if (contexto != null)
                    {
                        if (entidad != null)
                        {
                            //Revisar entidad
                            if (!String.IsNullOrEmpty(entidad.EsquemaId) && !entidad.EsquemaId.Equals(contexto.Entidad.EsquemaId))
                            {
                                continue;
                            }
                            if (!String.IsNullOrEmpty(entidad.Id) && !entidad.Id.Equals(contexto.Entidad.Id))
                            {
                                continue;
                            }
                        }
                        //Verificar unidad
                        if (unidad != null && unidadHecho != null && !unidadHecho.EsEquivalente(unidad))
                        {
                            continue;
                        }
                        //Verificar fechas
                        if (contexto.Periodo.Tipo == Period.Instante)
                        {
                            if (!contexto.Periodo.FechaInstante.Equals(fechaFin))
                            {
                                continue;
                            }
                        }
                        else if (contexto.Periodo.Tipo == Period.Duracion)
                        {
                            if (!contexto.Periodo.FechaFin.Equals(fechaFin) || !contexto.Periodo.FechaInicio.Equals(fechaInicio))
                            {
                                continue;
                            }
                        }
                        //Verificar dimensiones
                        if (considerarDimensiones && !contexto.SonDimensionesEquivalentes(valoresDimensiones))
                        {
                            continue;
                        }
                        hechosResultado.Add(hecho);
                    }
                }
            }
            return(hechosResultado);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Verifica si este objeto es igual o equivalente a otra entidad
        /// </summary>
        /// <param name="entidad">entidad la entidad contra la cual se comparará esta entidad.</param>
        /// <returns>true si las dos entidad son estructuralmente iguales. false en cualquier otro caso</returns>
        public bool EstructuralmenteIgual(EntidadDto entidad)
        {
            bool resultado = true;

            if (entidad == null)
            {
                resultado = false;
            }
            else
            {
                if (this.EsquemaId.Equals(entidad.EsquemaId) && this.Id.Equals(entidad.Id) && this.ContieneInformacionDimensional == entidad.ContieneInformacionDimensional)
                {
                    if (this.ContieneInformacionDimensional)
                    {
                        if ((this.ValoresDimension != null && entidad.ValoresDimension == null) || (entidad.ValoresDimension != null && this.ValoresDimension == null))
                        {
                            return(false);
                        }
                        else
                        {
                            if (this.ValoresDimension != null && entidad.ValoresDimension != null)
                            {
                                if (this.ValoresDimension.Count != entidad.ValoresDimension.Count)
                                {
                                    resultado = false;
                                }
                                else
                                {
                                    foreach (var valorDimension in this.ValoresDimension)
                                    {
                                        bool equivalenteEncontrado = false;
                                        foreach (var valorDimensionComparar in entidad.ValoresDimension)
                                        {
                                            if (valorDimensionComparar.EsEquivalente(valorDimension))
                                            {
                                                equivalenteEncontrado = true;
                                                break;
                                            }
                                        }
                                        if (!equivalenteEncontrado)
                                        {
                                            resultado = false;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    resultado = false;
                }
            }
            return(resultado);
        }