Ejemplo n.º 1
0
        /// <summary>
        /// Agrega al caché de taxonomías una nueva taxonomía.
        /// Las taxonomías se guardan en el caché en función de su conjunto de dts de puntos de entrada.
        /// Indica si el caché de taxonomías fue actualizado, si es la primera vez que se agrega esa taxonomía se retorna false, si
        /// la taxonomía ya existía y fue reemplazada se regresa un true
        /// </summary>
        /// <param name="dtsTaxonomia">Lista de puntos de entrada para la taxonomía</param>
        /// <param name="taxonomia">Taxonomía a agregar al caché</param>
        /// <returns>True si la taxonomía ya había sido agregada antes y fue reemplazada, false si es la primera vez que se agrega</returns>
        public bool AgregarTaxonomia(IList <ArchivoImportadoDocumento> dtsTaxonomia, ITaxonomiaXBRL taxonomia)
        {
            if (dtsTaxonomia == null)
            {
                return(true);
            }
            //Buscar si la taxonomía ya existe en el caché
            foreach (var keyValTax in _cacheTaxonomias)
            {
                if (EsMismoDTS(keyValTax.Key, dtsTaxonomia))
                {
                    //Reemplazar
                    _cacheTaxonomias[keyValTax.Key] = taxonomia;
                    return(true);
                }
            }
            //Taxonomía nueva
            var listaDts = CopiarListaDts(dtsTaxonomia);

            _cacheTaxonomias.Add(listaDts, taxonomia);
            return(false);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Constructor básico, se necesita un nodo con la declaración del elemento primario para inicial el hipercubo
        /// </summary>
        /// <param name="nodoOrigen"></param>
        public Hipercubo(NodoLinkbase nodoOrigen, ConectorLinkbase conectorInicial, RoleType rol, IDictionary <ConceptDimensionItem, ConceptItem> listaDimensionesDefault, ITaxonomiaXBRL tax)
        {
            ListaDimensiones = new List <Dimension>();
            Rol = rol;
            DeclaracionElementoPrimario = nodoOrigen;
            //Elementos primarios
            _elementosPrimarios.Add(nodoOrigen.Elemento as ConceptItem);
            LlenarElementosPrimarios(nodoOrigen);
            //Determinar el tipo de elemento en el contexto donde aparece la información dimensional del hipercubo
            ElementoContexto = (conectorInicial.Arco as ArcoDefinicion).ElementoContexto;
            //Atributo cerrado
            Cerrado = (conectorInicial.Arco as ArcoDefinicion).Closed != null
                          ? (conectorInicial.Arco as ArcoDefinicion).Closed.Value
                          : false;
            ArcRoleDeclaracion = conectorInicial.Arco.ArcoRol;

            ElementoHipercubo = conectorInicial.NodoSiguiente;
            //Dimensiones
            foreach (var conectoresDimension in ElementoHipercubo.ConectoresSalientes.Where(x => x.Arco.ArcoRol.Equals(ArcoDefinicion.HypercubeDimensionRole)))
            {
                var dimDec = new Dimension();

                dimDec.ConceptoDimension = conectoresDimension.NodoSiguiente.Elemento as ConceptDimensionItem;
                dimDec.Explicita         = dimDec.ConceptoDimension.ReferenciaDimensionTipificada == null;
                ListaDimensiones.Add(dimDec);
                foreach (var dimDefault in listaDimensionesDefault.Where(x => x.Key == conectoresDimension.NodoSiguiente.Elemento))
                {
                    if (!_dimensionDefaults.ContainsKey(dimDefault.Key))
                    {
                        _dimensionDefaults.Add(dimDefault.Key, dimDefault.Value);
                        dimDec.MiembroDefault = dimDefault.Value;
                    }
                }
                //Llenar dominio de dimensión
                LlenarDominioDeDimension(dimDec, conectoresDimension.NodoSiguiente, tax);
                //Quitar del dominio a los elementos no usables que pudieran quedar repetidos
                foreach (var noUsable in dimDec.MiembrosDominioNoUsables)
                {
                    dimDec.MiembrosDominio.Remove(noUsable);
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Colecta los miembros válidos de dominio de dimensiones
        /// </summary>
        /// <param name="dimension">Declaración de la dimensión</param>
        /// <param name="nodoActual"> </param>
        /// <param name="tax"> </param>
        private void LlenarDominioDeDimension(Dimension dimension, NodoLinkbase nodoActual, ITaxonomiaXBRL tax)
        {
            IList <string> arcoRolesBuscados = new List <string>()
            {
                ArcoDefinicion.DimensionDomainRole, ArcoDefinicion.DomainMemberRole
            };

            foreach (var conectorSiguiente in nodoActual.ConectoresSalientes.Where(x => x.Arco != null && arcoRolesBuscados.Contains(x.Arco.ArcoRol)))
            {
                //considerar el atributo usable
                if (!((conectorSiguiente.Arco as ArcoDefinicion).Usable != null && !(conectorSiguiente.Arco as ArcoDefinicion).Usable.Value))
                {
                    if (!dimension.MiembrosDominio.Contains(conectorSiguiente.NodoSiguiente.Elemento))
                    {
                        dimension.MiembrosDominio.Add(conectorSiguiente.NodoSiguiente.Elemento as ConceptItem);
                    }
                }
                else
                {
                    if (!dimension.MiembrosDominioNoUsables.Contains(conectorSiguiente.NodoSiguiente.Elemento))
                    {
                        dimension.MiembrosDominioNoUsables.Add(conectorSiguiente.NodoSiguiente.Elemento as ConceptItem);
                    }
                }
                LlenarDominioDeDimension(dimension, conectorSiguiente.NodoSiguiente, tax);
            }
            if (!dimension.Explicita)
            {
                //Localizar el schema element de la dimensión
                if (dimension.ConceptoDimension.ReferenciaDimensionTipificada != null)
                {
                    foreach (var esquema in tax.ArchivosEsquema.Where(x => x.Key.Equals(dimension.ConceptoDimension.ReferenciaDimensionTipificada.UbicacionArchivo)))
                    {
                        foreach (XmlSchemaElement unElemento in esquema.Value.Elements.Values)
                        {
                            if (unElemento.Id != null && unElemento.Id.Equals(dimension.ConceptoDimension.ReferenciaDimensionTipificada.Identificador))
                            {
                                dimension.ConceptoDimension.ElementoDimensionTipificada = unElemento;
                                break;
                            }
                        }
                    }
                }
            }
        }