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