/// <summary>
        /// Asigna el valor de una celda en una hoja en base a un renglón y columna
        /// </summary>
        /// <param name="hoja">Hoja donde se asignará el valor de la celda</param>
        /// <param name="renglon">Número de renglón</param>
        /// <param name="columna">Número de columna</param>
        /// <param name="valor">Valor a asignar</param>
        /// <param name="tipoCelda">Tipo de celda a crear</param>
        /// <param name="hecho">Hecho asignado a esta celda</param>
        public static void AsignarValorCelda(ISheet hoja, int renglon, int columna, string valor, CellType tipoCelda, HechoDto hecho, Boolean asignarComentarios = true)
        {
            if (hoja.LastRowNum < renglon)
            {
                hoja.CreateRow(renglon);
            }
            var celda = hoja.GetRow(renglon).GetCell(columna, MissingCellPolicy.CREATE_NULL_AS_BLANK);

            celda.SetCellType(tipoCelda);
            if (CellType.Numeric == tipoCelda)
            {
                double valorDouble = 0;
                if (Double.TryParse(valor, NumberStyles.Any, CultureInfo.InvariantCulture, out valorDouble))
                {
                    celda.SetCellValue(valorDouble);
                }
                else
                {
                    celda.SetCellValue(valor);
                }
            }
            else
            {
                celda.SetCellValue(valor);
            }
            if (asignarComentarios)
            {
                AgregarComentarioCelda(hoja, celda, hecho);
            }
        }
        /// <summary>
        /// Pinta los campos de persona responsable.
        /// </summary>
        /// <param name="docBuilder">Constructor del documento.</param>
        /// <param name="estructuraReporte">Estructura del reporte</param>
        public void PintaCamposTablaFirmaArticulo13(DocumentBuilder docBuilder, ReporteXBRLDTO estructuraReporte)
        {
            var            diccionarioFiguraResponsable = GeneraDiccionarioPersonasResponsables(estructuraReporte);
            var            indexFiguraResponsable       = 0;
            var            leyendaArticulo13            = "";
            IList <String> listaIdHechoFirmaLeyenda13   = null;

            if (estructuraReporte.Instancia.HechosPorIdConcepto.TryGetValue("ar_pros_IssuanceUnderArt13OfTheCUELegend", out listaIdHechoFirmaLeyenda13))
            {
                var      idHechoFirmas = listaIdHechoFirmaLeyenda13.First();
                HechoDto hechoFirmas   = null;
                if (estructuraReporte.Instancia.HechosPorId.TryGetValue(idHechoFirmas, out hechoFirmas))
                {
                    leyendaArticulo13 = hechoFirmas.Valor;
                }
            }
            foreach (var idItemMiembroFiguraResponsable in diccionarioFiguraResponsable.Keys)
            {
                if (indexFiguraResponsable > 0)
                {
                    docBuilder.InsertBreak(BreakType.PageBreak);
                }
                indexFiguraResponsable++;
                var listaInstituciones   = diccionarioFiguraResponsable[idItemMiembroFiguraResponsable];
                var contieneLeyendaArt13 = false;
                foreach (var institucionArt13 in listaInstituciones)
                {
                    if (institucionArt13.ContieneFirmasLeyendaArt13)
                    {
                        contieneLeyendaArt13 = true;
                        break;
                    }
                }
                if (!contieneLeyendaArt13)
                {
                    continue;
                }
                //ImprimirTituloFiguraResponsable(idItemMiembroFiguraResponsable, docBuilder, estructuraReporte);
                for (var indexInstitucion = 0; indexInstitucion < listaInstituciones.Count; indexInstitucion++)
                {
                    var institucionPersonaResponsable = listaInstituciones[indexInstitucion];
                    if (!institucionPersonaResponsable.ContieneFirmasLeyendaArt13)
                    {
                        continue;
                    }
                    if (indexInstitucion > 0)
                    {
                        docBuilder.InsertBreak(BreakType.PageBreak);
                    }
                    ImprimirLeyenda(leyendaArticulo13, docBuilder);
                    ImprimirTituloInstitucion(institucionPersonaResponsable.Institucion, docBuilder);
                    var listaMiembrosOriginal = institucionPersonaResponsable.Miembros;
                    var listaMiembros         = new List <PersonaResponsableMiembro431000DTO>();

                    foreach (var mienbroOriginal in listaMiembrosOriginal)
                    {
                        if (mienbroOriginal.FirmaArticulo13)
                        {
                            listaMiembros.Add(mienbroOriginal);
                        }
                    }

                    for (var indexMiembro = 0; indexMiembro < listaMiembros.Count; indexMiembro += 2)
                    {
                        var listaMiembrosTabla = new List <PersonaResponsableMiembro431000DTO>();
                        listaMiembrosTabla.Add(listaMiembros[indexMiembro]);
                        var siguienteIndice = (indexMiembro + 1);
                        if (siguienteIndice < listaMiembros.Count)
                        {
                            listaMiembrosTabla.Add(listaMiembros[siguienteIndice]);
                        }
                        ImprimirMiembrosPersonasResponsables(listaMiembrosTabla, docBuilder);
                    }
                }
            }
        }
Exemple #3
0
        /// <summary>
        /// Crea un Hecho a partir de su representación en el modelo de instancia
        /// </summary>
        /// <param name="instanciaDb"></param>
        /// <param name="hechoDto"></param>
        /// <param name="listaTiposDato"></param>
        /// <returns></returns>
        public static Hecho CrearHechoDb(DocumentoInstancia instanciaDb, HechoDto hechoDto, List <TipoDato> listaTiposDato, DocumentoInstanciaXbrlDto documentoInstancia)
        {
            var hechoDb = new Hecho
            {
                IdConcepto     = hechoDto.IdConcepto,
                Concepto       = hechoDto.NombreConcepto,
                EspacioNombres = hechoDto.EspacioNombres,
                IdRef          = hechoDto.Id,
                EsTupla        = hechoDto.EsTupla,
                IdInterno      = hechoDto.Consecutivo
            };
            //Si el hecho DTO no tiene espacio de nombres y concepto, entonces intentar buscarlo de la taxonomía:
            var tipoDatoXbrl = hechoDto.TipoDatoXbrl;
            var tipoDato     = hechoDto.TipoDato;

            if ((String.IsNullOrEmpty(hechoDto.NombreConcepto) || String.IsNullOrEmpty(hechoDto.EspacioNombres)) && documentoInstancia.Taxonomia != null)
            {
                if (documentoInstancia.Taxonomia.ConceptosPorId.ContainsKey(hechoDto.IdConcepto))
                {
                    hechoDb.Concepto       = documentoInstancia.Taxonomia.ConceptosPorId[hechoDto.IdConcepto].Nombre;
                    hechoDb.EspacioNombres = documentoInstancia.Taxonomia.ConceptosPorId[hechoDto.IdConcepto].EspacioNombres;
                    if (String.IsNullOrEmpty(tipoDatoXbrl) || String.IsNullOrEmpty(tipoDato))
                    {
                        tipoDatoXbrl = documentoInstancia.Taxonomia.ConceptosPorId[hechoDto.IdConcepto].TipoDatoXbrl;
                        tipoDato     = documentoInstancia.Taxonomia.ConceptosPorId[hechoDto.IdConcepto].TipoDato;
                    }
                }
                else
                {
                    return(null);
                }
            }
            if ((String.IsNullOrWhiteSpace(tipoDatoXbrl) || String.IsNullOrWhiteSpace(tipoDato)) && documentoInstancia.Taxonomia != null)
            {
                if (documentoInstancia.Taxonomia.ConceptosPorId.ContainsKey(hechoDto.IdConcepto))
                {
                    tipoDatoXbrl = documentoInstancia.Taxonomia.ConceptosPorId[hechoDto.IdConcepto].TipoDatoXbrl;
                    tipoDato     = documentoInstancia.Taxonomia.ConceptosPorId[hechoDto.IdConcepto].TipoDato;
                }
            }
            if (hechoDto.TuplaPadre != null)
            {
                hechoDb.IdInternoTuplaPadre = hechoDto.TuplaPadre.Consecutivo;
            }

            if (!hechoDto.EsTupla)
            {
                hechoDb.Valor = hechoDto.Valor;
                if (hechoDto.EsFraccion)
                {
                    //TODO: agregar 2 campos mas a la tabla
                }


                //Buscar el contexto
                var ctxDb = instanciaDb.Contexto.FirstOrDefault(x => x.Nombre.Equals(hechoDto.IdContexto));
                if (ctxDb != null)
                {
                    hechoDb.IdContexto = ctxDb.IdContexto;
                }

                //Buscar unidad
                var unidadDb = instanciaDb.Unidad.FirstOrDefault(x => x.IdRef.Equals(hechoDto.IdUnidad));
                if (unidadDb != null)
                {
                    hechoDb.IdUnidad = unidadDb.IdUnidad;
                }
                if (!hechoDto.DecimalesEstablecidos && !hechoDto.PrecisionEstablecida)
                {
                    hechoDto.Decimales = ConstantesGenerales.VALOR_DECIMALES_DEFAULT;
                }
                if (hechoDto.DecimalesEstablecidos)
                {
                    hechoDb.Precision = null;
                    hechoDb.Decimales = hechoDto.Decimales;
                }
                if (hechoDto.PrecisionEstablecida)
                {
                    hechoDb.Decimales = null;
                    hechoDb.Precision = hechoDto.Precision;
                }
                //Buscar el tipo de dato

                var tipoDatoCatalogo = listaTiposDato.FirstOrDefault(x => x.Nombre.Equals(tipoDato));
                if (tipoDatoCatalogo != null)
                {
                    hechoDb.IdTipoDato = tipoDatoCatalogo.IdTipoDato;
                }
                else
                {
                    tipoDatoCatalogo = listaTiposDato.FirstOrDefault(x => x.Nombre.Equals(tipoDatoXbrl));
                    if (tipoDatoCatalogo != null)
                    {
                        hechoDb.IdTipoDato = tipoDatoCatalogo.IdTipoDato;
                    }
                }
            }

            hechoDb.IdDocumentoInstancia = instanciaDb.IdDocumentoInstancia;

            return(hechoDb);
        }
Exemple #4
0
        /// <summary>
        /// Convierte los registros de los Hechos de un documento de instancia en base de datos
        /// a su representación en DTO
        /// </summary>
        /// <param name="instanciaDb"></param>
        /// <param name="instanciaXbrlDto"></param>
        private static void CargarHechos(DocumentoInstancia instanciaDb, DocumentoInstanciaXbrlDto instanciaXbrlDto)
        {
            var listaGeneralHechos = new List <HechoDto>();

            foreach (var hechoDb in instanciaDb.Hecho)
            {
                var hechoDto = new HechoDto
                {
                    Id                    = hechoDb.IdRef,
                    IdConcepto            = hechoDb.IdConcepto,
                    Valor                 = hechoDb.Valor,
                    NombreConcepto        = hechoDb.Concepto,
                    EspacioNombres        = hechoDb.EspacioNombres,
                    EsTupla               = hechoDb.EsTupla,
                    Consecutivo           = hechoDb.IdInterno != null ? hechoDb.IdInterno.Value : 0,
                    ConsecutivoPadre      = hechoDb.IdInternoTuplaPadre != null ? hechoDb.IdInternoTuplaPadre.Value : 0,
                    CambioValorComparador = false,
                };

                //Precision y decimales
                if (!String.IsNullOrEmpty(hechoDb.Decimales))
                {
                    hechoDto.Decimales = hechoDb.Decimales;
                }
                if (!String.IsNullOrEmpty(hechoDb.Precision))
                {
                    hechoDto.Precision = hechoDb.Precision;
                }
                if (hechoDb.TipoDato != null)
                {
                    hechoDto.TipoDato     = hechoDb.TipoDato.Nombre;
                    hechoDto.EsNumerico   = hechoDb.TipoDato.EsNumerico;
                    hechoDto.NoEsNumerico = !hechoDto.EsNumerico;
                    hechoDto.EsFraccion   = hechoDb.TipoDato.EsFraccion;
                }
                //Unidad
                hechoDto.IdUnidad = hechoDb.Unidad != null ? hechoDb.Unidad.IdRef : null;
                //Contexto
                hechoDto.IdContexto = hechoDb.Contexto != null ? hechoDb.Contexto.Nombre : null;

                if (!instanciaXbrlDto.HechosPorIdConcepto.ContainsKey(hechoDto.IdConcepto))
                {
                    instanciaXbrlDto.HechosPorIdConcepto.Add(hechoDto.IdConcepto, new List <string>());
                }
                if (!instanciaXbrlDto.HechosPorId.ContainsKey(hechoDto.IdConcepto))
                {
                    instanciaXbrlDto.HechosPorId.Add(hechoDto.Id, hechoDto);
                }
                instanciaXbrlDto.HechosPorIdConcepto[hechoDto.IdConcepto].Add(hechoDto.Id);

                listaGeneralHechos.Add(hechoDto);
            }

            //Asociar estructura de tuplas
            var tuplas     = listaGeneralHechos.Where(x => x.EsTupla).ToList();
            var diccTuplas = new Dictionary <long, HechoDto>();

            foreach (var tupla in tuplas)
            {
                tupla.Hechos = new List <String>();
                diccTuplas.Add(tupla.Consecutivo, tupla);
            }

            var hechosHijo = listaGeneralHechos.Where(x => x.ConsecutivoPadre > 0).ToList();

            //Asociar estructura de tuplas
            foreach (var hijo in hechosHijo)
            {
                if (diccTuplas.ContainsKey(hijo.ConsecutivoPadre))
                {
                    var tupla = diccTuplas[hijo.ConsecutivoPadre];
                    tupla.Hechos.Add(hijo.Id);
                    hijo.TuplaPadre = tupla;
                }
            }
        }
        /// <summary>
        /// Parse a XBRL fact to JBRL fact.
        /// </summary>
        /// <param name="factXBRL">Fact to be parse.</param>
        /// <param name="document">Document owner of the fact.</param>
        /// <returns>JBRL fact.</returns>
        public static FactJBRL Parse(
            HechoDto factXBRL,
            DocumentoInstanciaXbrlDto document,
            String reportId,
            String reportRecordId,
            DateTime registrationDate,
            IDictionary <String, String> extraParams,
            String replacementId = null)
        {
            var factJbrl = new FactJBRL();

            factJbrl.value            = factXBRL.Valor;
            factJbrl.conceptId        = factXBRL.IdConcepto;
            factJbrl.reportId         = reportId;
            factJbrl.reportRecordId   = reportRecordId;
            factJbrl.registrationDate = registrationDate;
            ConceptoDto concept;

            if (document.Taxonomia.ConceptosPorId.TryGetValue(factXBRL.IdConcepto, out concept))
            {
                factJbrl.conceptLabel = GetConceptLabel(concept);
                factJbrl.dataType     = concept.TipoDato;
            }
            else
            {
                return(null);
            }
            ContextoDto context;

            factJbrl.dimensionMap = new Dictionary <String, String>();
            if (extraParams != null)
            {
                foreach (var paramId in extraParams.Keys)
                {
                    factJbrl.dimensionMap[paramId] = extraParams[paramId];
                }
            }
            if (document.ContextosPorId.TryGetValue(factXBRL.IdContexto, out context))
            {
                factJbrl.dimensionMap["entity"] = context.Entidad.Id;
                if (context.Periodo.Tipo.Equals(PeriodoDto.Instante))
                {
                    factJbrl.dimensionMap["periodInstantDate"] = factJbrl.ParseString(context.Periodo.FechaInstante);
                    factJbrl.dimensionMap["periodMainDate"]    = factJbrl.dimensionMap["periodInstantDate"];
                }
                else if (context.Periodo.Tipo.Equals(PeriodoDto.Duracion))
                {
                    factJbrl.dimensionMap["periodStartDate"] = factJbrl.ParseString(context.Periodo.FechaInicio);
                    factJbrl.dimensionMap["periodEndDate"]   = factJbrl.ParseString(context.Periodo.FechaFin);
                    factJbrl.dimensionMap["periodMainDate"]  = factJbrl.dimensionMap["periodEndDate"];
                }
                factJbrl.dimensionMap["isDimensional"] = context.ContieneInformacionDimensional.ToString().ToLower();
                var listOfdimensionsXbrl = context.ValoresDimension == null || context.ValoresDimension.Count == 0 ? context.Entidad.ValoresDimension : context.ValoresDimension;
                if (listOfdimensionsXbrl != null)
                {
                    foreach (var dimensionXbrl in listOfdimensionsXbrl)
                    {
                        var dimensionId = "xbrlDim_" + dimensionXbrl.IdDimension;
                        var member      = GetDimensionMember(dimensionXbrl, document);
                        factJbrl.dimensionMap[dimensionId] = member;
                    }
                }
            }
            else
            {
                return(null);
            }
            UnidadDto unit;

            if (!String.IsNullOrEmpty(factXBRL.IdUnidad) && document.UnidadesPorId.TryGetValue(factXBRL.IdUnidad, out unit))
            {
                factJbrl.dimensionMap["unit"] = GetUnitValue(unit);
            }
            if (!String.IsNullOrEmpty(factXBRL.Decimales))
            {
                factJbrl.dimensionMap["decimals"] = factXBRL.Decimales;
            }
            if (!String.IsNullOrEmpty(factXBRL.Precision))
            {
                factJbrl.dimensionMap["precision"] = factXBRL.Precision;
            }
            var isChunk = false;
            var value   = factJbrl.value;

            if (!String.IsNullOrWhiteSpace(value) && value.Length > ConstBlockStoreHechos.MAX_STRING_VALUE_LENGTH)
            {
                isChunk = true;
            }
            factJbrl.isChunk   = isChunk;
            factJbrl.contextId = factJbrl.GetContextHash();

            factJbrl.factId = factJbrl.GeneraHashId();
            if (!string.IsNullOrEmpty(replacementId))
            {
                factJbrl.replacementId = replacementId;
                factJbrl.isReplaced    = true;
            }

            return(factJbrl);
        }
        /// <summary>
        /// Actualiza el valor de un hecho en el documento de instancia
        /// </summary>
        /// <param name="resumenImportacion"></param>
        /// <param name="hechoActualizar"></param>
        /// <param name="valorImportar"></param>
        /// <param name="plantillaDocumento"></param>
        private void ActualizarValorHecho(Common.Dtos.ResumenProcesoImportacionExcelDto resumenImportacion, HechoDto hechoActualizar, string valorImportar,
                                          IDefinicionPlantillaXbrl plantillaDocumento, DocumentoInstanciaXbrlDto instancia, ISheet hojaImportar, int iRenglon, int columna)
        {
            var concepto = instancia.Taxonomia.ConceptosPorId[hechoActualizar.IdConcepto];

            if (!ActualizarValor(concepto, valorImportar, hechoActualizar, plantillaDocumento))
            {
                resumenImportacion.AgregarErrorFormato(
                    UtilAbax.ObtenerEtiqueta(instancia.Taxonomia, concepto.Id),
                    hojaImportar.SheetName,
                    iRenglon.ToString(),
                    "0",
                    valorImportar);
            }
            else
            {
                resumenImportacion.TotalHechosImportados++;
                var hechoImportado = new AbaxXBRLCore.Common.Dtos.InformacionHechoImportadoExcelDto()
                {
                    IdConcepto     = hechoActualizar.IdConcepto,
                    IdHecho        = hechoActualizar.Id,
                    ValorImportado = valorImportar,
                    HojaExcel      = hojaImportar.SheetName,
                    Renglon        = iRenglon,
                    Columna        = columna
                };
                resumenImportacion.AgregarHechoImportado(hechoImportado, UtilAbax.ObtenerEtiqueta(instancia.Taxonomia, hechoActualizar.Id));
            }
        }
        /// <summary>
        /// Importa los datos de un grupo de hechos que corresponden a un tipo de pasivo en específico
        /// </summary>
        private void ImportarGrupoTipoPasivo(ISheet hojaAImportar, int renglonTipoPasivo, string tipoPasivoActual, DocumentoInstanciaXbrlDto instancia,
                                             IDefinicionPlantillaXbrl plantillaDocumento, Common.Dtos.ResumenProcesoImportacionExcelDto resumenImportacion, IDictionary <string, string> secuenciasAsignadas,
                                             IList <string> etiquetasConceptosMiembro)
        {
            var hechosDeTipoPasivo = ObtenerHechosPorDimensionYMiembro(instancia, plantillaDocumento, _idDimensionTipoPasivo, tipoPasivoActual);
            int iCol     = _columnaInicioDatos;
            int iRenglon = renglonTipoPasivo;

            string[] listaPrimarios = null;
            if (_miembrosBancarios.Contains(tipoPasivoActual))
            {
                listaPrimarios = _elementosPrimariosBancarios;
            }
            if (_miembrosBursatiles.Contains(tipoPasivoActual))
            {
                listaPrimarios = _elementosPrimariosBursatiles;
            }
            if (_miembrosOtros.Contains(tipoPasivoActual))
            {
                listaPrimarios = _elementosPrimariosOtros;
            }
            if (_idItemMiembroGranTotal.Equals(tipoPasivoActual))
            {
                listaPrimarios = _elementosPrimariosGranTotal;
            }


            if (_miembrosTipoPasivoTotales.Contains(tipoPasivoActual))
            {
                int iMiembroSubtabla = 0;
                var dimensiones      = new List <DimensionInfoDto>()
                {
                    new DimensionInfoDto()
                    {
                        Explicita     = true,
                        IdDimension   = _idDimensionTipoPasivo,
                        IdItemMiembro = tipoPasivoActual
                    }
                };
                var contextoTotales = BuscarOCrearContexto(instancia, plantillaDocumento, dimensiones, _idDimensionSecuencia, null, secuenciasAsignadas);
                foreach (var elementoPrimario in listaPrimarios)
                {
                    if (_elementosPrimariosTotal.Contains(elementoPrimario))
                    {
                        var valorImportar = ExcelUtil.ObtenerValorCelda(hojaAImportar, iRenglon, iCol);
                        if (!String.IsNullOrEmpty(valorImportar))
                        {
                            HechoDto hechoActualizar = null;
                            if (elementoPrimario.Equals(_idConceptoSubtabla))
                            {
                                var dimensionesSubtabla = new List <DimensionInfoDto>();
                                dimensionesSubtabla.AddRange(dimensiones);
                                dimensionesSubtabla.Add(new DimensionInfoDto()
                                {
                                    Explicita     = true,
                                    IdDimension   = _idDimensionIntervalo,
                                    IdItemMiembro = _miembrosIntervaloDeTiempo[iMiembroSubtabla]
                                });
                                var contextoSubtabla = BuscarOCrearContexto(instancia, plantillaDocumento, dimensionesSubtabla, _idDimensionSecuencia, null, secuenciasAsignadas);
                                var listaHechos      = ObtenerHechosPorElementoPrimarioYSecuencia(instancia, hechosDeTipoPasivo, elementoPrimario, null);
                                listaHechos = FiltrarHechosPorDimensionYMiembro(instancia, listaHechos, _idDimensionIntervalo, _miembrosIntervaloDeTiempo[iMiembroSubtabla++]);
                                if (listaHechos.Count > 0)
                                {
                                    hechoActualizar = listaHechos[0];
                                }
                                else
                                {
                                    hechoActualizar = CrearHecho(instancia, plantillaDocumento, elementoPrimario, contextoSubtabla);
                                }
                            }
                            else
                            {
                                var listaHechos = ObtenerHechosPorElementoPrimarioYSecuencia(instancia, hechosDeTipoPasivo, elementoPrimario, null);
                                if (listaHechos.Count > 0)
                                {
                                    hechoActualizar = listaHechos[0];
                                }
                                else
                                {
                                    hechoActualizar = CrearHecho(instancia, plantillaDocumento, elementoPrimario, contextoTotales);
                                }
                            }
                            if (hechoActualizar != null)
                            {
                                ActualizarValorHecho(resumenImportacion, hechoActualizar, valorImportar, plantillaDocumento, instancia, hojaAImportar, iRenglon, iCol);
                            }
                        }
                    }
                    iCol++;
                }
            }
            else
            {
                //Inicio de un grupo de detalle de pasivos
                iRenglon++;

                var dimensiones = new List <DimensionInfoDto>()
                {
                    new DimensionInfoDto()
                    {
                        Explicita     = true,
                        IdDimension   = _idDimensionTipoPasivo,
                        IdItemMiembro = tipoPasivoActual
                    }
                };
                bool finGrupo = false;
                while (!finGrupo)
                {
                    int iMiembroSubtabla = 0;
                    //Determinar la secuencia
                    string secuencia    = null;
                    var    nombrePasivo = ExcelUtil.ObtenerValorCelda(hojaAImportar, iRenglon, _columnaInicioDatos);
                    if (!String.IsNullOrEmpty(nombrePasivo))
                    {
                        secuencia = BuscarSecuenciaDePasivo(instancia, hechosDeTipoPasivo, nombrePasivo);
                        if (secuencia == null)
                        {
                            secuencia = ObtenerSiguienteSecuencia(secuenciasAsignadas);
                        }

                        var contextoDestino = BuscarOCrearContexto(instancia, plantillaDocumento, dimensiones, _idDimensionSecuencia, secuencia, secuenciasAsignadas);
                        iCol = _columnaInicioDatos;
                        foreach (var elementoPrimario in listaPrimarios)
                        {
                            var valorImportar = ExcelUtil.ObtenerValorCelda(hojaAImportar, iRenglon, iCol);
                            if (!String.IsNullOrEmpty(valorImportar))
                            {
                                HechoDto hechoActualizar = null;
                                if (elementoPrimario.Equals(_idConceptoSubtabla))
                                {
                                    var dimensionesSubtabla = new List <DimensionInfoDto>();
                                    dimensionesSubtabla.AddRange(dimensiones);
                                    dimensionesSubtabla.Add(new DimensionInfoDto()
                                    {
                                        Explicita     = true,
                                        IdDimension   = _idDimensionIntervalo,
                                        IdItemMiembro = _miembrosIntervaloDeTiempo[iMiembroSubtabla]
                                    });
                                    var contextoSubtabla = BuscarOCrearContexto(instancia, plantillaDocumento, dimensionesSubtabla, _idDimensionSecuencia, secuencia, secuenciasAsignadas);
                                    var listaHechos      = ObtenerHechosPorElementoPrimarioYSecuencia(instancia, hechosDeTipoPasivo, elementoPrimario, secuencia);
                                    listaHechos = FiltrarHechosPorDimensionYMiembro(instancia, listaHechos, _idDimensionIntervalo, _miembrosIntervaloDeTiempo[iMiembroSubtabla++]);
                                    if (listaHechos.Count > 0)
                                    {
                                        hechoActualizar = listaHechos[0];
                                    }
                                    else
                                    {
                                        hechoActualizar = CrearHecho(instancia, plantillaDocumento, elementoPrimario, contextoSubtabla);
                                    }
                                }
                                else
                                {
                                    var listaHechos = ObtenerHechosPorElementoPrimarioYSecuencia(instancia, hechosDeTipoPasivo, elementoPrimario, secuencia);
                                    if (listaHechos.Count > 0)
                                    {
                                        hechoActualizar = listaHechos[0];
                                    }
                                    else
                                    {
                                        hechoActualizar = CrearHecho(instancia, plantillaDocumento, elementoPrimario, contextoDestino);
                                    }
                                }
                                if (hechoActualizar != null)
                                {
                                    ActualizarValorHecho(resumenImportacion, hechoActualizar, valorImportar, plantillaDocumento, instancia, hojaAImportar, iRenglon, iCol);
                                }
                            }

                            iCol++;
                        }
                    }


                    iRenglon++;
                    finGrupo = iRenglon > hojaAImportar.LastRowNum ||
                               etiquetasConceptosMiembro.Contains(ExcelUtil.ObtenerValorCelda(hojaAImportar, iRenglon, _columnaTituloTipoPasivo));
                }
            }
        }
Exemple #8
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);
        }
Exemple #9
0
        /// <summary>
        /// Busca el indice de la relación periodo del hecho con las columnas generadas
        /// </summary>
        /// <param name="documentoInstanciaXbrlDto">Modelo DTO</param>
        /// <param name="columnas">lista de columnas que tiene el reporte</param>
        /// <param name="hecho">objeto hechoDTO </param>
        /// <returns></returns>
        private int BuscarIndexColumna(DocumentoInstanciaXbrlDto documentoInstanciaXbrlDto, List <EstructuraColumnaReporte> columnas, HechoDto hecho, bool agruparPorUnidad)
        {
            var contexto = documentoInstanciaXbrlDto.ContextosPorId[hecho.IdContexto];

            for (int idCol = 0; idCol < columnas.Count; idCol++)
            {
                var columna     = columnas[idCol];
                var unidadHecho = hecho.IdUnidad != null ? documentoInstanciaXbrlDto.UnidadesPorId[hecho.IdUnidad] : (UnidadDto)null;

                if (columna.Entidad.Equals(contexto.Entidad.Id))
                {
                    if ((columna.FechaInicio.Equals(contexto.Periodo.FechaInicio) &&
                         columna.FechaFin.Equals(contexto.Periodo.FechaFin) &&
                         columna.FechaInstante.Equals(contexto.Periodo.FechaInstante)))
                    {
                        if (agruparPorUnidad)
                        {
                            if (String.IsNullOrEmpty(columna.MonedaId))
                            {
                                if (unidadHecho == null)
                                {
                                    return(idCol);
                                }
                            }
                            else
                            {
                                //Si columna tiene unidad y hecho tiene unidad, verificar si son compatibles
                                if (unidadHecho != null && unidadHecho.EsEquivalente(documentoInstanciaXbrlDto.UnidadesPorId[columna.MonedaId]))
                                {
                                    return(idCol);
                                }
                            }
                        }
                        else
                        {
                            return(idCol);
                        }
                    }
                }
            }
            return(-1);
        }