/// <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); }
/// <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); } } }
/// <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; } } } } } }