private static void FillFactItemDependencies(List <FactItem> rootFacts, FactItem currentItem = null) { if (currentItem == null) { foreach (var item in rootFacts) { FillFactItemDependencies(rootFacts, item); } // start return; } if (!currentItem.Contains.Any() || currentItem.ContainsFactItems.Any()) { // end return; } foreach (var item in currentItem.Contains) { var found = rootFacts.FirstOrDefault(rf => rf.What == item.Key); if (found == null) { continue; } currentItem.ContainsFactItems.Add(found, item.Value); } foreach (var item in currentItem.ContainsFactItems) { FillFactItemDependencies(rootFacts, item.Key); } }
/// <summary> /// Crear un hecho dto basado en un fact /// </summary> /// <param name="hecho"></param> /// <returns></returns> private HechoDto CrearHechoDto(FactItem hecho) { var hechoDto = new HechoDto(); hechoDto.ClaveEmpresa = hecho.Contexto.Entidad.Id; hechoDto.Etiqueta = GetEtiqueta(hecho); if (hecho.Contexto.Escenario != null) { //determinar columna hechoDto.Dimension = ObtenerDimensionMember(hecho.Contexto.Escenario.ElementoOrigen); } if (hecho is FactNumericItem) { Unit unidad = ((FactNumericItem)hecho).Unidad; if (unidad.Medidas != null && unidad.Medidas.Count > 0) { hechoDto.Unidad = unidad.Medidas[0].LocalName; hechoDto.Valor = ((FactNumericItem)hecho).ValorRedondeado.ToString(); } else { hechoDto.Unidad = unidad.Numerador[0].LocalName + "/" + unidad.Denominador[0].LocalName; hechoDto.Valor = ((FactNumericItem)hecho).ValorRedondeado.ToString(); } } else { hechoDto.Valor = hecho.Valor; } return(hechoDto); }
private static int FindBagsInside(List <FactItem> facts, FactItem start, bool init = false) { var count = 0; if (start == null) { return(count); } count = init ? 0 : 1; foreach (var item in start.ContainsFactItems) { count += (item.Value * FindBagsInside(facts, item.Key)); } return(count); }
/// <summary> /// Valida la pareja concreta de hechos de un documento de instancia que están relacionados con un arco del tipo essence-alias /// </summary> /// <param name="hechoEssence">Hecho Primario</param> /// <param name="hechoAlias">Hecho opcional o alias</param> private void ValidarParejaHechosEssenceAlias(FactItem hechoEssence, FactItem hechoAlias) { //Si un concepto essence y alias existen en una instancia y son C-Equal y P-Equal (contexto y padre) if (hechoEssence.Contexto.StructureEquals(hechoAlias.Contexto) && hechoEssence.ParentEqual(hechoAlias)) { //Entonces estos 2 hechos deben de ser Value Equal y Unit Equal if (hechoEssence is FactNumericItem && hechoAlias is FactNumericItem) { if (!((FactNumericItem)hechoEssence).Unidad.StructureEquals(((FactNumericItem)hechoAlias).Unidad)) { ManejadorErrores.ManejarError(null, "5.2.6.2.2 Se encontraron dos hechos relacionados como essence-alias en el mismo contexto " + " pero cuya unidad no es igual o equivalente", System.Xml.Schema.XmlSeverityType.Error); } } if ((hechoEssence is FactNumericItem && !(hechoAlias is FactNumericItem)) || (!(hechoEssence is FactNumericItem) && hechoAlias is FactNumericItem)) { ManejadorErrores.ManejarError(null, "5.2.6.2.2 Se encontraron dos hechos relacionados como essence-alias en el mismo contexto " + " pero cuyo tipo de dato no es equivalente", System.Xml.Schema.XmlSeverityType.Error); } //Comparar valores solo si ambos son diferentes de vacio o nulo if (!String.IsNullOrEmpty(hechoEssence.Valor) && !String.IsNullOrEmpty(hechoAlias.Valor)) { if (hechoEssence is FactNumericItem) { if (!((FactNumericItem)hechoEssence).ValueEquals((FactNumericItem)hechoAlias)) { ManejadorErrores.ManejarError(null, "5.2.6.2.2 Se encontraron dos hechos relacionados como essence-alias en el mismo contexto " + " pero cuyo valor no es el mismo", System.Xml.Schema.XmlSeverityType.Error); } } else { if (!hechoEssence.ValueEquals(hechoAlias)) { ManejadorErrores.ManejarError(null, "5.2.6.2.2 Se encontraron dos hechos relacionados como essence-alias en el mismo contexto " + " pero cuyo valor no es el mismo", System.Xml.Schema.XmlSeverityType.Error); } } } } }
/// <summary> /// Valida que el periodo asociado al contexto relacionado con un hecho reportado corresponga según el tipo de periodo indicado para el elemento en la taxonomía. /// </summary> /// <param name="hecho">el hecho a validar</param> private void ValidarContextoDeHecho(Fact hecho) { if (hecho is FactItem) { FactItem item = (FactItem)hecho; if (((ConceptItem)item.Concepto).TipoPeriodo.Name.Equals(ConceptItem.InstantPeriodType) && item.Contexto.Periodo.Tipo != Period.Instante) { ManejadorErrores.ManejarError(null, "5.1.1.1 Se encontró un hecho reportado en el documento instancia cuyo tipo de periodo es instante en la taxonomía y el contexto asociado de reporte no es de tipo instante. ", System.Xml.Schema.XmlSeverityType.Error); } else if (((ConceptItem)item.Concepto).TipoPeriodo.Name.Equals(ConceptItem.DurationPeriodType) && (item.Contexto.Periodo.Tipo == Period.Instante)) { ManejadorErrores.ManejarError(null, "5.1.1.1 Se encontró un hecho reportado en el documento instancia cuyo tipo de periodo es duración en la taxonomía y el contexto asociado de reporte no es de tipo duración. ", System.Xml.Schema.XmlSeverityType.Error); } } else { FactTuple tuple = (FactTuple)hecho; foreach (Fact factTuple in tuple.Hechos) { ValidarContextoDeHecho(factTuple); } } }
/// <summary> /// Valida que el hecho sea valido respecto al hipercubo donde se reporta, esta /// función evalúa el contexto y que sus dimensiones sean válidas y correctas respecto a sus dominios /// </summary> /// <param name="hecho">Hecho a validar</param> /// <param name="hipercubo">Hipercubo a evaluar</param> /// <returns></returns> private bool ValidarHechoEnHipercubo(FactItem hecho, Hipercubo hipercubo) { IList <MiembroDimension> valoresDimension = new List <MiembroDimension>(); IList <XmlElement> elementosExtras = new List <XmlElement>(); if (hipercubo.ElementoContexto == TipoElementoContexto.Escenario) { if (hecho.Contexto.Escenario != null) { valoresDimension = hecho.Contexto.Escenario.MiembrosDimension; elementosExtras = hecho.Contexto.Escenario.ElementosAdicionales; } } else { if (hecho.Contexto.Entidad.Segmento != null) { valoresDimension = hecho.Contexto.Entidad.Segmento.MiembrosDimension; elementosExtras = hecho.Contexto.Entidad.Segmento.ElementosAdicionales; } } IList <MiembroDimension> valoresEfectivosDimension = new List <MiembroDimension>(); foreach (var nodoDimension in hipercubo.ListaDimensiones) { //Para cada dimension buscar su valor var valorMiembro = valoresDimension.FirstOrDefault(x => x.Dimension == nodoDimension.ConceptoDimension); if (valorMiembro != null) { //Valor de dimensión encontrada //Dimensión OK //Validar el dominio if (!EsDominioValido(valorMiembro, nodoDimension)) { return(false); } valoresEfectivosDimension.Add(valorMiembro); } else { //El valor de la dimensión no existe, verificar si tiene default para inferirlo ConceptItem dimDefault = hipercubo.ObtenerDimensionDefault(nodoDimension.ConceptoDimension); if (dimDefault != null) { //Verificar si la dimensión default es parte del dominio válido if (nodoDimension.MiembrosDominio.Contains(dimDefault)) { valoresEfectivosDimension.Add(new MiembroDimension(nodoDimension.ConceptoDimension, dimDefault)); } } } } //Contar los valores para las dimensiones if (hipercubo.ListaDimensiones.Count != valoresEfectivosDimension.Count) { return(false); } if (hipercubo.Cerrado) { //Si el hipercubo es cerrado y tiene más información de la que debería if (elementosExtras != null) { if (hipercubo.ListaDimensiones.Count < (valoresDimension.Count + elementosExtras.Count)) { return(false); } } } return(true); }
private static List <string> FindSearchColor(List <FactItem> factItems, string search, FactItem currentFact = null) { List <string> count = new List <string>(); // start if (currentFact == null) { foreach (var fact in factItems) { var foundItems = FindSearchColor(factItems, search, fact); if (foundItems.Any()) { count.Add(fact.What); count.AddRange(foundItems); } } } else if (currentFact.What == search) { count.Add(currentFact.What); } if (currentFact?.Contains.Any() != true) { return(count); } foreach (var containFact in currentFact.Contains) { var curFact = factItems.FirstOrDefault(item => item.What == containFact.Key); if (curFact == null) { continue; } var foundItems = FindSearchColor(factItems, search, curFact); if (foundItems.Any()) { count.Add(containFact.Key); count.AddRange(foundItems); } } return(count); }
public void TestCargaInstancia() { TaxonomiaXBRL taxonomiaXBRL = new TaxonomiaXBRL(); IManejadorErroresXBRL manejadorErroresTax = new ManejadorErroresCargaTaxonomia(); Debug.WriteLine(DateTime.Now); taxonomiaXBRL.ManejadorErrores = manejadorErroresTax; taxonomiaXBRL.ProcesarDefinicionDeEsquema("http://emisnet.bmv.com.mx/taxonomy/mx-ifrs-ics-2012-04-01/All/ifrs-mx-ics-entryPoint-all-2012-04-01.xsd"); taxonomiaXBRL.CrearArbolDeRelaciones(); taxonomiaXBRL.CrearRelacionesDimensionales(); Debug.WriteLine(DateTime.Now); DocumentoInstanciaXBRL inst = new DocumentoInstanciaXBRL(); ManejadorErroresCargaTaxonomia manejadorErrores = new ManejadorErroresCargaTaxonomia(); IGrupoValidadoresTaxonomia valTax = new GrupoValidadoresTaxonomia(); valTax.ManejadorErrores = manejadorErroresTax; valTax.Taxonomia = taxonomiaXBRL; valTax.AgregarValidador(new ValidadorTaxonomia()); valTax.AgregarValidador(new ValidadorTaxonomiaDinemsional()); valTax.ValidarDocumento(); inst.Taxonomia = taxonomiaXBRL; inst.ManejadorErrores = manejadorErrores; FileStream archivo = new FileStream("C:\\workspace_abax\\AbaxXBRL\\ifrsxbrl_AC_2014-2.xbrl", FileMode.Open); inst.Cargar(archivo); IGrupoValidadoresTaxonomia grupoValidadores = new GrupoValidadoresTaxonomia(); IValidadorDocumentoInstancia validador = new ValidadorDocumentoInstancia(); grupoValidadores.ManejadorErrores = inst.ManejadorErrores; grupoValidadores.DocumentoInstancia = inst; grupoValidadores.AgregarValidador(validador); validador = new ValidadorDimensionesDocumentoInstancia(); validador.DocumentoInstancia = inst; grupoValidadores.AgregarValidador(validador); grupoValidadores.ValidarDocumento(); FactItem hechoItem = null; //carga de contextos y hechos var instanciaDto = new AbaxXBRLCore.Viewer.Application.Dto.Angular.DocumentoInstanciaDto(); if (manejadorErrores.PuedeContinuar()) { foreach (Fact hecho in inst.Hechos) { //Verificar si el contexto existe if (hecho is FactItem) { hechoItem = (FactItem)hecho; } } } Assert.IsTrue(true); }