/// <summary>
        /// Actualiza o crea un hecho en base a los criterios enviados como parámetro
        /// </summary>
        /// <param name="instancia">Documento instnacia actual</param>
        /// <param name="idConcepto">Concepto actual</param>
        /// <param name="hojaAImportar">Hoja actualmente procesada</param>
        /// <param name="renglonActual">Renglón actualmente procesado</param>
        /// <param name="numColumna">Columna actualmente procesada</param>
        /// <param name="contextoDestino">Contexto a donde se asignarán los hechos creados</param>
        private void ActualizarValorHecho(DocumentoInstanciaXbrlDto instancia, string idConcepto, ISheet hojaAImportar, int renglonActual, int numColumna,
                                          AbaxXBRLCore.Viewer.Application.Dto.ContextoDto contextoDestino, IDefinicionPlantillaXbrl plantillaDocumento, AbaxXBRLCore.Common.Dtos.ResumenProcesoImportacionExcelDto resumenImportacion)
        {
            var valorCelda   = ExcelUtil.ObtenerValorCelda(hojaAImportar, renglonActual, numColumna);
            var fechaDefault = plantillaDocumento.ObtenerVariablePorId("fecha_2016_10_12");

            if (!String.IsNullOrEmpty(valorCelda))
            {
                ConceptoDto conceptoImportado = instancia.Taxonomia.ConceptosPorId[idConcepto];
                HechoDto    hechoActualizar   = null;

                var hechos = instancia.BuscarHechos(idConcepto, null, null, contextoDestino.Periodo.FechaInstante, contextoDestino.Periodo.FechaInstante, null, false);

                if (hechos.Count > 0)
                {
                    hechoActualizar = hechos[0];
                }
                else
                {
                    hechoActualizar = instancia.CrearHecho(idConcepto, null, contextoDestino.Id, "A" + Guid.NewGuid().ToString());

                    plantillaDocumento.InyectaHechoADocumentoInstancia(hechoActualizar);
                }

                if (!UtilAbax.ActualizarValorHecho(conceptoImportado, hechoActualizar, valorCelda, fechaDefault))
                {
                    resumenImportacion.AgregarErrorFormato(
                        UtilAbax.ObtenerEtiqueta(instancia.Taxonomia, conceptoImportado.Id),
                        hojaAImportar.SheetName,
                        renglonActual.ToString(),
                        numColumna.ToString(),
                        valorCelda);
                }
                else
                {
                    resumenImportacion.TotalHechosImportados++;
                    var hechoImportado = new AbaxXBRLCore.Common.Dtos.InformacionHechoImportadoExcelDto()
                    {
                        IdConcepto     = hechoActualizar.IdConcepto,
                        IdHecho        = hechoActualizar.Id,
                        ValorImportado = valorCelda,
                        HojaExcel      = hojaAImportar.SheetName,
                        Renglon        = renglonActual,
                        Columna        = numColumna
                    };

                    resumenImportacion.AgregarHechoImportado(hechoImportado, UtilAbax.ObtenerEtiqueta(instancia.Taxonomia, conceptoImportado.Id));
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Verifica si existe informacion del formato en alguno de los periodos
        /// </summary>
        /// <param name="instancia">Documento de instancia donde se buscan los hechos</param>
        /// <param name="idConceptoBuscado">Identificador del concepto buscado</param>
        /// <param name="fechaInicio">Fecha de inicio buscada</param>
        /// <param name="fechaFin">Fecha de fin o fecha instante buscada</param>
        /// <param name="infoDimensional">Información extra opcional dimensional a filtrar</param>
        /// <returns>True si existe el hecho buscado en esas fechas y dimensiones, false en otro caso</returns>
        protected bool ExisteInformacionEnPeriodo(DocumentoInstanciaXbrlDto instancia, String idConceptoBuscado, DateTime fechaInicio, DateTime fechaFin, IList <DimensionInfoDto> infoDimensional)
        {
            AbaxXBRLCore.Viewer.Application.Dto.HechoDto    hecho = null;
            AbaxXBRLCore.Viewer.Application.Dto.ContextoDto ctx   = null;
            if (instancia.HechosPorIdConcepto.ContainsKey(idConceptoBuscado))
            {
                var idHechos = instancia.HechosPorIdConcepto[idConceptoBuscado];
                foreach (var idHecho in idHechos)
                {
                    if (instancia.HechosPorId.ContainsKey(idHecho))
                    {
                        hecho = instancia.HechosPorId[idHecho];
                        if (hecho.IdContexto != null && instancia.ContextosPorId.ContainsKey(hecho.IdContexto))
                        {
                            ctx = instancia.ContextosPorId[hecho.IdContexto];
                            if (ctx != null)
                            {
                                bool dimensionOk = infoDimensional == null;

                                if (infoDimensional != null)
                                {
                                    dimensionOk = ctx.SonDimensionesEquivalentes(infoDimensional);
                                }
                                if (dimensionOk)
                                {
                                    if (ctx.Periodo.Tipo == PeriodoDto.Instante)
                                    {
                                        if (fechaFin.Equals(ctx.Periodo.FechaInstante))
                                        {
                                            return(true);
                                        }
                                    }
                                    else if (ctx.Periodo.Tipo == PeriodoDto.Duracion)
                                    {
                                        if (fechaInicio.Equals(ctx.Periodo.FechaInicio) && fechaFin.Equals(ctx.Periodo.FechaFin))
                                        {
                                            return(true);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(false);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Actualiza o crea un hecho en base a los parámetros enviados
        /// </summary>

        private void ActualizarValorHecho(ConceptoDto concepto, string valorCelda, List <DimensionInfoDto> dimensiones,
                                          DateTime fechaInicio, DateTime fechaFin, string qNameEntidad, DocumentoInstanciaXbrlDto instancia, IDefinicionPlantillaXbrl plantillaDocumento,
                                          AbaxXBRLCore.Common.Dtos.ResumenProcesoImportacionExcelDto resumenImportacion, ISheet hojaImportar, int iRenglon, int columna)
        {
            if (String.IsNullOrEmpty(valorCelda))
            {
                return;
            }
            var hechos = instancia.BuscarHechos(concepto.Id, null, null, fechaInicio, fechaFin, dimensiones);

            if (hechos.Count > 0)
            {
                foreach (var hechoActualizar in hechos)
                {
                    if (!ActualizarValor(concepto, valorCelda, hechoActualizar, plantillaDocumento))
                    {
                        resumenImportacion.AgregarErrorFormato(
                            UtilAbax.ObtenerEtiqueta(instancia.Taxonomia, concepto.Id),
                            hojaImportar.SheetName,
                            iRenglon.ToString(),
                            "0",
                            valorCelda);
                    }
                    else
                    {
                        resumenImportacion.TotalHechosImportados++;
                        var hechoImportado = new AbaxXBRLCore.Common.Dtos.InformacionHechoImportadoExcelDto()
                        {
                            IdConcepto     = hechoActualizar.IdConcepto,
                            IdHecho        = hechoActualizar.Id,
                            ValorImportado = valorCelda,
                            HojaExcel      = hojaImportar.SheetName,
                            Renglon        = iRenglon,
                            Columna        = columna
                        };
                        resumenImportacion.AgregarHechoImportado(hechoImportado, UtilAbax.ObtenerEtiqueta(instancia.Taxonomia, hechoActualizar.Id));
                    }
                }
            }
            else
            {
                var qNameCompleto = XmlUtil.ParsearQName(qNameEntidad);
                AbaxXBRLCore.Viewer.Application.Dto.ContextoDto contextoDestino = null;
                var tipoPeriodo = concepto.TipoPeriodo.Equals(EtiquetasXBRLConstantes.Instant) ? Period.Instante : Period.Duracion;
                var contextos   = instancia.BuscarContexto(qNameEntidad,
                                                           tipoPeriodo, fechaInicio, fechaFin, dimensiones);
                if (contextos == null || contextos.Count == 0)
                {
                    contextoDestino = new AbaxXBRLCore.Viewer.Application.Dto.ContextoDto()
                    {
                        Entidad = new EntidadDto()
                        {
                            ContieneInformacionDimensional = false,
                            EsquemaId = qNameCompleto.Namespace,
                            Id        = qNameCompleto.Name
                        },
                        ContieneInformacionDimensional = dimensiones.Count > 0,
                        ValoresDimension = dimensiones,
                        Periodo          = new PeriodoDto()
                        {
                            Tipo          = tipoPeriodo,
                            FechaInicio   = fechaInicio,
                            FechaFin      = fechaFin,
                            FechaInstante = fechaFin
                        },

                        Id = "C" + Guid.NewGuid().ToString()
                    };
                    plantillaDocumento.InyectarContextoADocumentoInstancia(contextoDestino);
                }
                else
                {
                    contextoDestino = contextos[0];
                }

                UnidadDto unidadDestino = null;
                if (concepto.EsTipoDatoNumerico)
                {
                    //Si es moentario
                    var listaMedidas = new List <MedidaDto>();

                    if (concepto.TipoDatoXbrl.Contains(TiposDatoXBRL.MonetaryItemType))
                    {
                        listaMedidas.Add(new MedidaDto()
                        {
                            EspacioNombres = plantillaDocumento.ObtenerVariablePorId("medida_http___www_xbrl_org_2003_iso4217"),
                            Nombre         = plantillaDocumento.ObtenerVariablePorId("medida_MXN")
                        });
                    }
                    else
                    {
                        //Unidad pure
                        listaMedidas.Add(new MedidaDto()
                        {
                            EspacioNombres = plantillaDocumento.ObtenerVariablePorId("medida_http___www_xbrl_org_2003_instance"),
                            Nombre         = plantillaDocumento.ObtenerVariablePorId("medida_pure")
                        });
                    }

                    var unidades = instancia.BuscarUnidades(Unit.Medida, listaMedidas, null);
                    if (unidades == null || unidades.Count == 0)
                    {
                        unidadDestino = new UnidadDto()
                        {
                            Id      = "U" + Guid.NewGuid().ToString(),
                            Tipo    = Unit.Medida,
                            Medidas = listaMedidas
                        };
                        instancia.UnidadesPorId.Add(unidadDestino.Id, unidadDestino);
                    }
                    else
                    {
                        unidadDestino = unidades[0];
                    }
                }

                var hechoNuevo = instancia.CrearHecho(concepto.Id, unidadDestino != null ? unidadDestino.Id : null, contextoDestino.Id, "A" + Guid.NewGuid().ToString());
                if (concepto.EsTipoDatoNumerico)
                {
                    hechoNuevo.Decimales = _valorDecimalesHechos;
                }

                if (!ActualizarValor(concepto, valorCelda, hechoNuevo, plantillaDocumento))
                {
                    resumenImportacion.AgregarErrorFormato(
                        UtilAbax.ObtenerEtiqueta(instancia.Taxonomia, concepto.Id),
                        hojaImportar.SheetName,
                        iRenglon.ToString(),
                        "0",
                        valorCelda);
                }
                else
                {
                    resumenImportacion.TotalHechosImportados++;
                    var hechoImportado = new AbaxXBRLCore.Common.Dtos.InformacionHechoImportadoExcelDto()
                    {
                        IdConcepto     = hechoNuevo.IdConcepto,
                        IdHecho        = hechoNuevo.Id,
                        ValorImportado = valorCelda,
                        HojaExcel      = hojaImportar.SheetName,
                        Renglon        = iRenglon,
                        Columna        = columna
                    };
                    resumenImportacion.AgregarHechoImportado(hechoImportado, UtilAbax.ObtenerEtiqueta(instancia.Taxonomia, hechoNuevo.Id));
                }

                plantillaDocumento.InyectaHechoADocumentoInstancia(hechoNuevo);
            }
        }
        /// <summary>
        /// Importa los datos de un hecho de otro documento de instancia.
        /// Busca unidad o contexto que sea equivalente, de otra forma crea unidades y contextos asociados
        /// </summary>
        /// <param name="hechoImportar">Hecho a importar</param>
        /// <param name="instancia">Documento de instancia orgien del hecho</param>
        /// <returns>ID del hecho importado en le documento de instancia</returns>
        public String ImportarHecho(HechoDto hechoImportar, DocumentoInstanciaXbrlDto instancia)
        {
            String nuevoId = null;

            if (this.Taxonomia.ConceptosPorId.ContainsKey(hechoImportar.IdConcepto))
            {
                nuevoId = "I" + Guid.NewGuid().ToString();
                String idContexto = null;
                String idUnidad   = null;

                if (hechoImportar.IdUnidad != null)
                {
                    UnidadDto unidadOrigen      = instancia.UnidadesPorId[hechoImportar.IdUnidad];
                    var       uniadesNuevoHecho = BuscarUnidades(unidadOrigen.Tipo, Unit.Medida == unidadOrigen.Tipo ?unidadOrigen.Medidas :unidadOrigen.MedidasNumerador, unidadOrigen.MedidasDenominador);
                    if (uniadesNuevoHecho != null && uniadesNuevoHecho.Count > 0)
                    {
                        idUnidad = uniadesNuevoHecho[0].Id;
                    }
                    else
                    {
                        var unidadDestino = new UnidadDto()
                        {
                            Id                 = "UI" + Guid.NewGuid().ToString(),
                            Tipo               = unidadOrigen.Tipo,
                            Medidas            = unidadOrigen.Medidas,
                            MedidasNumerador   = unidadOrigen.MedidasNumerador,
                            MedidasDenominador = unidadOrigen.MedidasDenominador
                        };
                        UnidadesPorId.Add(unidadDestino.Id, unidadDestino);
                        idUnidad = unidadDestino.Id;
                    }
                }

                if (hechoImportar.IdContexto != null)
                {
                    ContextoDto contextoOrigen = instancia.ContextosPorId[hechoImportar.IdContexto];
                    var         valoresDim     = new List <DimensionInfoDto>();
                    if (contextoOrigen.Entidad.ValoresDimension != null)
                    {
                        valoresDim.AddRange(contextoOrigen.Entidad.ValoresDimension);
                    }
                    if (contextoOrigen.ValoresDimension != null)
                    {
                        valoresDim.AddRange(contextoOrigen.ValoresDimension);
                    }

                    var contextos = BuscarContexto(contextoOrigen.Entidad.EsquemaId + ":" + contextoOrigen.Entidad.Id, contextoOrigen.Periodo.Tipo,
                                                   contextoOrigen.Periodo.Tipo == Period.Instante? contextoOrigen.Periodo.FechaInstante:contextoOrigen.Periodo.FechaInicio,
                                                   contextoOrigen.Periodo.Tipo == Period.Instante? contextoOrigen.Periodo.FechaInstante:contextoOrigen.Periodo.FechaFin,
                                                   valoresDim
                                                   );
                    if (contextos != null && contextos.Count > 0)
                    {
                        idContexto = contextos[0].Id;
                        //LogUtil.Info("{contextoOrigen.Entidad.Id: [" + contextoOrigen.Entidad.Id + "], contextoDocumento.Entidad.Id:[" + contextos[0].Entidad.Id + "]}");
                    }
                    else
                    {
                        var contextoDestino = new ContextoDto()
                        {
                            Entidad = new EntidadDto()
                            {
                                ContieneInformacionDimensional = contextoOrigen.Entidad.ContieneInformacionDimensional,
                                EsquemaId = contextoOrigen.Entidad.EsquemaId,
                                Id        = contextoOrigen.Entidad.Id
                            },
                            ContieneInformacionDimensional = contextoOrigen.ContieneInformacionDimensional,
                            Periodo = new PeriodoDto()
                            {
                                Tipo          = contextoOrigen.Periodo.Tipo,
                                FechaInicio   = contextoOrigen.Periodo.FechaInicio,
                                FechaFin      = contextoOrigen.Periodo.FechaFin,
                                FechaInstante = contextoOrigen.Periodo.FechaInstante
                            },
                            ValoresDimension = contextoOrigen.ValoresDimension,
                            Id = "CI" + Guid.NewGuid().ToString()
                        };
                        ContextosPorId[contextoDestino.Id] = contextoDestino;
                        idContexto = contextoDestino.Id;
                    }
                }

                var hechoNuevo = CrearHecho(hechoImportar.IdConcepto, idUnidad, idContexto, nuevoId);
                hechoNuevo.Valor         = hechoImportar.Valor;
                hechoNuevo.ValorNumerico = hechoImportar.ValorNumerico;


                HechosPorId[nuevoId] = hechoNuevo;
                if (!HechosPorIdConcepto.ContainsKey(hechoNuevo.IdConcepto))
                {
                    HechosPorIdConcepto[hechoNuevo.IdConcepto] = new List <String>();
                }
                HechosPorIdConcepto[hechoNuevo.IdConcepto].Add(nuevoId);
            }

            return(nuevoId);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Determina si un contexto es estructuralmente igual a este contexto.
        /// </summary>
        /// <param name="contexto">contexto el contexto contra el cual se comparará este concepto.</param>
        /// <returns>true si ambos contextos son estructuralmente iguales. false en cualquier otro caso.</returns>
        public bool EstructuralmenteIgual(ContextoDto contexto)
        {
            bool resultado = true;

            if (contexto == null)
            {
                resultado = false;
            }
            else
            {
                if ((this.Periodo != null && contexto.Periodo == null) ||
                    (this.Periodo == null && contexto.Periodo != null))
                {
                    resultado = false;
                }
                else
                {
                    if (this.Periodo != null && contexto.Periodo != null)
                    {
                        if (this.Periodo.EstructuralmenteIgual(contexto.Periodo))
                        {
                            if ((this.Entidad != null && contexto.Entidad == null) || (this.Entidad == null && contexto.Entidad != null))
                            {
                                resultado = false;
                            }
                            else
                            {
                                if (this.Entidad != null && contexto.Entidad != null)
                                {
                                    if (this.Entidad.EstructuralmenteIgual(contexto.Entidad))
                                    {
                                        if (this.ContieneInformacionDimensional != contexto.ContieneInformacionDimensional)
                                        {
                                            resultado = false;
                                        }
                                        else
                                        {
                                            if ((this.ValoresDimension != null && contexto.ValoresDimension == null) || (contexto.ValoresDimension != null && this.ValoresDimension == null))
                                            {
                                                return(false);
                                            }
                                            else
                                            {
                                                if (this.ValoresDimension != null && contexto.ValoresDimension != null)
                                                {
                                                    if (this.ValoresDimension.Count != contexto.ValoresDimension.Count)
                                                    {
                                                        resultado = false;
                                                    }
                                                    else
                                                    {
                                                        foreach (var valorDimension in this.ValoresDimension)
                                                        {
                                                            bool equivalenteEncontrado = false;
                                                            foreach (var valorDimensionComparar in contexto.ValoresDimension)
                                                            {
                                                                if (valorDimensionComparar.EsEquivalente(valorDimension))
                                                                {
                                                                    equivalenteEncontrado = true;
                                                                    break;
                                                                }
                                                            }
                                                            if (!equivalenteEncontrado)
                                                            {
                                                                resultado = false;
                                                                break;
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        resultado = false;
                                    }
                                }
                            }
                        }
                        else
                        {
                            resultado = false;
                        }
                    }
                }
            }

            return(resultado);
        }