Exemple #1
0
        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);
            }
        }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
        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);
        }
Exemple #7
0
        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);
        }