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