Exemplo n.º 1
0
        /// <summary>
        /// Genera un listado de los conceptos con la relacion de sus dimensiones
        /// </summary>
        /// <param name="taxonomia">Objeto de taxonomía utilizado para obtener etiquetas de presentación</param>
        /// <param name="documentoInstanciaXbrlDto"></param>
        /// <param name="concepto">concepto a procesar</param>
        /// <param name="uriRolPresentacion"></param>
        /// <param name="idioma">Idioma de presentación</param>
        /// <param name="columnas">lista de columnas que tiene el reporte</param>
        /// <param name="nombreconcepto">nombre del concepto que se mostrar en el reporte</param>
        /// <param name="indentacion">Nivel del concepto</param>
        /// <returns></returns>
        private IList <EstructuraConceptoReporte> BuscarConceptosConDimensiones(TaxonomiaDto taxonomia, DocumentoInstanciaXbrlDto documentoInstanciaXbrlDto,
                                                                                ConceptoDto concepto, string uriRolPresentacion, string idioma, List <EstructuraColumnaReporte> columnas, string nombreconcepto, int indentacion, bool agruparPorUnidad)
        {
            List <EstructuraConceptoReporte> listaDeEstructurasConceptos = new List <EstructuraConceptoReporte>();

            if (!(concepto.EsAbstracto != null && concepto.EsAbstracto.Value))
            {
                var hechoIdsEncontrados = new List <string>();
                if (documentoInstanciaXbrlDto.HechosPorIdConcepto.ContainsKey(concepto.Id))
                {
                    hechoIdsEncontrados.AddRange(documentoInstanciaXbrlDto.HechosPorIdConcepto[concepto.Id]);
                }
                if (hechoIdsEncontrados.Count() == 0)
                {
                    var combinacionDimensiones = new Dictionary <string, EstructuraDimensionReporte>();
                    listaDeEstructurasConceptos.Add(new EstructuraConceptoReporte()
                    {
                        ConceptoId       = concepto.Id,
                        NombreConcepto   = nombreconcepto,
                        NivelIndentacion = indentacion,
                        EsAbstracto      = concepto.EsAbstracto,
                        Hechos           = new EstructuraHechoReporte[columnas.Count],
                        Dimensiones      = combinacionDimensiones
                    });
                    return(listaDeEstructurasConceptos);
                }
                else
                {
                    foreach (var hechoId in hechoIdsEncontrados)
                    {
                        HechoDto hecho = documentoInstanciaXbrlDto.HechosPorId[hechoId];
                        List <DimensionInfoDto> listaDimensionesTotales = new List <DimensionInfoDto>();
                        ContextoDto             contexto = documentoInstanciaXbrlDto.ContextosPorId[hecho.IdContexto];
                        if (contexto.ValoresDimension != null)
                        {
                            listaDimensionesTotales.AddRange(contexto.ValoresDimension);
                        }

                        if (contexto.Entidad.ValoresDimension != null)
                        {
                            listaDimensionesTotales.AddRange(contexto.Entidad.ValoresDimension);
                        }

                        AgregarDimensionesDefault(listaDimensionesTotales, taxonomia, concepto.Id, uriRolPresentacion);

                        EstructuraConceptoReporte estructuraEncontrada = null;
                        var estructuraDimensionesBuscada = CrearEstructuraDimensiones(listaDimensionesTotales, taxonomia, idioma);
                        foreach (var estConceptoActual in listaDeEstructurasConceptos)
                        {
                            if (EsMismaCombinacionDeDimensiones(estConceptoActual.Dimensiones, estructuraDimensionesBuscada))
                            {
                                estructuraEncontrada = estConceptoActual;
                                break;
                            }
                        }
                        //Si no se encontró la combinación de dimensiones, crear nueva
                        if (estructuraEncontrada == null)
                        {
                            estructuraEncontrada = new EstructuraConceptoReporte()
                            {
                                ConceptoId       = concepto.Id,
                                NombreConcepto   = nombreconcepto,
                                NivelIndentacion = indentacion,
                                EsAbstracto      = concepto.EsAbstracto,
                                Hechos           = new EstructuraHechoReporte[columnas.Count],
                                Dimensiones      = estructuraDimensionesBuscada
                            };
                            listaDeEstructurasConceptos.Add(estructuraEncontrada);
                        }

                        int posicion = BuscarIndexColumna(documentoInstanciaXbrlDto, columnas, hecho, agruparPorUnidad);
                        if (posicion != -1)
                        {
                            estructuraEncontrada.Hechos[posicion]                 = new EstructuraHechoReporte();
                            estructuraEncontrada.Hechos[posicion].HechoId         = hecho.Id;
                            estructuraEncontrada.Hechos[posicion].Valor           = hecho.Valor;
                            estructuraEncontrada.Hechos[posicion].ValorNumerico   = hecho.ValorNumerico;
                            estructuraEncontrada.Hechos[posicion].ValorRedondeado = hecho.ValorRedondeado;
                            estructuraEncontrada.Hechos[posicion].EsNumerico      = hecho.EsNumerico;
                        }
                    }
                }
            }
            else
            {
                listaDeEstructurasConceptos.Add(new EstructuraConceptoReporte()
                {
                    ConceptoId       = concepto.Id,
                    NombreConcepto   = nombreconcepto,
                    NivelIndentacion = indentacion,
                    EsAbstracto      = concepto.EsAbstracto,
                    Hechos           = new EstructuraHechoReporte[columnas.Count],
                    Dimensiones      = new Dictionary <string, EstructuraDimensionReporte>()
                });
            }

            return(listaDeEstructurasConceptos);
        }
Exemplo n.º 2
0
 /// <summary>
 /// Genera un listado de hechos con relacion al concepto sin dimension
 /// </summary>
 /// <param name="documentoInstanciaXbrlDto">Modelo DTO</param>
 /// <param name="concepto">concepto a procesar</param>
 /// <param name="uriRolPresentacion">uri del rol que se esta procesando</param>
 /// <param name="idioma">Idioma de presentación</param>
 /// <param name="columnas">lista de columnas que tiene el reporte</param>
 /// <returns></returns>
 private EstructuraHechoReporte[] ObtenerPrimerHechoSinDimension(DocumentoInstanciaXbrlDto documentoInstanciaXbrlDto, ConceptoDto concepto, string uriRolPresentacion, string idioma, List <EstructuraColumnaReporte> columnas, bool agruparPorUnidad)
 {
     EstructuraHechoReporte[] estructuraHecho = new EstructuraHechoReporte[columnas.Count()];
     if (documentoInstanciaXbrlDto.HechosPorIdConcepto.ContainsKey(concepto.Id))
     {
         int valoresDeHechosEncontrados = 0;
         var hechosIdSinDimension       = documentoInstanciaXbrlDto.HechosPorIdConcepto[concepto.Id];
         foreach (var hecho in documentoInstanciaXbrlDto.HechosPorId.Where(x => hechosIdSinDimension.Contains(x.Key)).Select(x => x.Value))
         {
             if (hecho.IdContexto != null && documentoInstanciaXbrlDto.ContextosPorId.ContainsKey(hecho.IdContexto))
             {
                 var ctx = documentoInstanciaXbrlDto.ContextosPorId[hecho.IdContexto];
                 if ((ctx.ValoresDimension != null && ctx.ValoresDimension.Count > 0) || (ctx.Entidad.ValoresDimension != null && ctx.Entidad.ValoresDimension.Count > 0))
                 {
                     continue;
                 }
             }
             if (valoresDeHechosEncontrados == columnas.Count)
             {
                 break;
             }
             ;
             int posicion = BuscarIndexColumna(documentoInstanciaXbrlDto, columnas, hecho, agruparPorUnidad);
             if (posicion != -1)
             {
                 estructuraHecho[posicion]                 = new EstructuraHechoReporte();
                 estructuraHecho[posicion].HechoId         = hecho.Id;
                 estructuraHecho[posicion].Valor           = hecho.Valor;
                 estructuraHecho[posicion].ValorNumerico   = hecho.ValorNumerico;
                 estructuraHecho[posicion].ValorRedondeado = hecho.ValorRedondeado;
                 estructuraHecho[posicion].EsNumerico      = hecho.EsNumerico;
                 valoresDeHechosEncontrados++;
             }
         }
     }
     return(estructuraHecho);
 }