/// <summary> /// /// </summary> /// <param name="filtro"></param> /// <param name="subconjuntoContextosIds"></param> /// <returns></returns> public IList <string> ObtenIdsContextosPorFiltro(FiltroHechosDto filtro, IList <string> subconjuntoContextosIds) { var contextosEvaluar = documentoInstancia.ContextosPorId; var idsContextosValidos = new List <string>(); var idsContextosFechas = new List <string>(); var diccionarioContextosValidos = new Dictionary <string, string>(); if (filtro.IdContexto != null && filtro.IdContexto.Count > 0) { contextosEvaluar = ObtenSubconjutoDiccionario(contextosEvaluar, filtro.IdContexto); } if (subconjuntoContextosIds != null && subconjuntoContextosIds.Count > 0) { contextosEvaluar = ObtenSubconjutoDiccionario(contextosEvaluar, subconjuntoContextosIds); } if (filtro.Periodo != null && filtro.Periodo.Count > 0) { for (var index = 0; index < filtro.Periodo.Count; index++) { var periodo = filtro.Periodo[index]; periodo.EvaluaVariablesPlantilla(definicionPlantilla); IList <String> idsConctextosGrupoFecha; if (documentoInstancia.ContextosPorFecha.TryGetValue(periodo.IdGrupoFechas, out idsConctextosGrupoFecha)) { idsContextosFechas = new List <string>(idsContextosFechas.Concat(idsConctextosGrupoFecha)); } } if (idsContextosFechas != null && idsContextosFechas.Count > 0) { contextosEvaluar = ObtenSubconjutoDiccionario(contextosEvaluar, idsContextosFechas); } } foreach (var idContexto in contextosEvaluar.Keys) { var contexto = contextosEvaluar[idContexto]; if (filtro.ClaveEntidad != null && filtro.ClaveEntidad.Count > 0 && filtro.ClaveEntidad.IndexOf(contexto.Entidad.Id) == -1) { continue; } if (filtro.ConjuntosParcialesDimensiones != null && filtro.ConjuntosParcialesDimensiones.Count > 0 && !ContenidoEnGruposParcialesDimensionesFiltro(contexto, filtro)) { continue; } if (filtro.ConjuntosExactosDimensiones != null && filtro.ConjuntosExactosDimensiones.Count > 0 && !ContenidoEnGruposExactosDimensionesFiltro(contexto, filtro)) { continue; } idsContextosValidos.Add(idContexto); } return(idsContextosValidos); }
/// <summary> /// Busca los hechos por el filtro dado. /// </summary> /// <param name="filtro">Objeto con los parametros de busqueda.</param> /// <returns>Lista con los identificadores de hecho encontrados.</returns> public IList <string> BuscaHechosPorFiltro(FiltroHechosDto filtro) { IList <string> idsHechos = filtro.IdHecho != null && filtro.IdHecho.Count > 0 ? filtro.IdHecho : null; if (filtro.IdConcepto != null && filtro.IdConcepto.Count > 0) { idsHechos = ObtenHechosIdsPorIdsConcepto(filtro.IdConcepto, idsHechos); if (idsHechos.Count == 0) { return(idsHechos); } } var filtrarPorUnidad = (filtro.IdUnidad != null && filtro.IdUnidad.Count > 0) || (filtro.TipoUnidad > 0); if (filtrarPorUnidad) { var idsUnidadesValidas = ObtenIdsUnidadesPorFiltroUnidad(filtro); if (idsUnidadesValidas != null && idsUnidadesValidas.Count > 0) { idsHechos = ObtenHechosIdsPorUnidadesIds(idsUnidadesValidas, idsHechos); if (idsHechos.Count == 0) { return(idsHechos); } } else { return(new List <string>()); } } var filtrarPorContexto = (filtro.IdContexto != null && filtro.IdContexto.Count > 0) || (filtro.Periodo != null && filtro.Periodo.Count > 0) || (filtro.ClaveEntidad != null && filtro.ClaveEntidad.Count > 0) || (filtro.ConjuntosParcialesDimensiones != null && filtro.ConjuntosParcialesDimensiones.Count > 0) || (filtro.ConjuntosExactosDimensiones != null && filtro.ConjuntosExactosDimensiones.Count > 0); if (filtrarPorContexto) { var contextosHechos = idsHechos != null && idsHechos.Count > 0 ? ObtenIdsContextosHechos(idsHechos) : null; var idsContextosValidos = ObtenIdsContextosPorFiltro(filtro, contextosHechos); idsHechos = ObtenHechosIdPorContextosIds(idsContextosValidos, idsHechos); } return(idsHechos != null ? idsHechos : new List <string>()); }
/// <summary> /// Obtiene los identificadores de las unidades validas según el filtro. /// </summary> /// <param name="filtro">Flitro que será aplicado.</param> /// <returns>Lista con los identificadores de las unidades validas.</returns> public IList <string> ObtenIdsUnidadesPorFiltroUnidad(FiltroHechosDto filtro) { var diccionarioUnidadesEvaluar = documentoInstancia.UnidadesPorId; var idsUnidadesValidas = new List <string>(); var diccionarioUnidadesValidas = new Dictionary <string, string>(); if (filtro.IdUnidad != null && filtro.IdUnidad.Count > 0) { diccionarioUnidadesEvaluar = ObtenSubconjutoDiccionario(diccionarioUnidadesEvaluar, filtro.IdUnidad); } foreach (var idUnidad in diccionarioUnidadesEvaluar.Keys) { var unidad = diccionarioUnidadesEvaluar[idUnidad]; if (filtro.TipoUnidad != null && (filtro.TipoUnidad != unidad.Tipo)) { continue; } if (filtro.Unidad != null && filtro.Unidad.Count > 0) { var contieneUnidad = false; for (var index = 0; index < filtro.Unidad.Count; index++) { var itemFiltroUnidad = filtro.Unidad[index]; if (unidad.EsEquivalente(itemFiltroUnidad)) { contieneUnidad = true; break; } } if (!contieneUnidad) { continue; } } if (!diccionarioUnidadesValidas.ContainsKey(idUnidad)) { diccionarioUnidadesValidas[idUnidad] = idUnidad; idsUnidadesValidas.Add(idUnidad); } } return(idsUnidadesValidas); }
/// <summary> /// Verifica si un contexto cumple con las condiciones del fitro. /// </summary> /// <param name="contexto">Contexto que será evaluado.</param> /// <param name="filtro">Filtro con las condiciones a evaluar.</param> /// <returns>Si el contexto cumple o no con las condiciones de filtrado.</returns> private Boolean ContenidoEnGruposExactosDimensionesFiltro(ContextoDto contexto, FiltroHechosDto filtro) { if (!contexto.ContieneInformacionDimensional && !contexto.Entidad.ContieneInformacionDimensional) { return(false); } var grupoDimensionesContexto = (contexto.ValoresDimension != null && contexto.ValoresDimension.Count > 0) ? contexto.ValoresDimension : contexto.Entidad.ValoresDimension; if (grupoDimensionesContexto == null || grupoDimensionesContexto.Count == 0) { return(false); } var contenido = false; for (var index = 0; index < filtro.ConjuntosExactosDimensiones.Count; index++) { var matchGroup = true; var dimensionGroup = filtro.ConjuntosExactosDimensiones[index]; if (dimensionGroup == null || dimensionGroup.Count != grupoDimensionesContexto.Count) { continue; } for (var indexDimContext = 0; indexDimContext < grupoDimensionesContexto.Count; indexDimContext++) { var dimConteined = false; var dimensionContexto = grupoDimensionesContexto[indexDimContext]; for (var indexGroup = 0; indexGroup < dimensionGroup.Count; indexGroup++) { var dimensionFilter = dimensionGroup[indexGroup]; if (dimensionFilter.QNameDimension != dimensionContexto.QNameDimension) { continue; } if (dimensionFilter.Explicita != dimensionContexto.Explicita) { continue; } if (dimensionFilter.QNameItemMiembro != null && dimensionFilter.QNameItemMiembro != dimensionContexto.QNameItemMiembro) { continue; } if (dimensionFilter.ElementoMiembroTipificado != null && dimensionFilter.ElementoMiembroTipificado != dimensionContexto.ElementoMiembroTipificado) { continue; } dimConteined = true; break; } if (!dimConteined) { matchGroup = false; break; } } if (matchGroup) { contenido = true; break; } } return(contenido); }
/// <summary> /// Inicializa diccionarios auxiliares. /// </summary> private void Init() { var periodos = new List <PlantillaPeriodoDto>(); var conjuntosDimensiones = new List <IList <DimensionInfoDto> >(); foreach (var aliasPlantillaPeriodo in configuracion.PlantillasContextos.Keys) { var plantillaContexto = configuracion.PlantillasContextos[aliasPlantillaPeriodo]; var plantillaPeriodo = plantillaContexto.Periodo; periodos.Add(plantillaPeriodo); } var listaFiltroDimensiones = new List <DimensionInfoDto>(); foreach (var aliasDimensionItem in configuracion.PlantillaDimensiones.Keys) { var plantillaDimension = configuracion.PlantillaDimensiones[aliasDimensionItem]; var dimension = new DimensionInfoDto() { Explicita = plantillaDimension.Explicita, QNameDimension = plantillaDimension.QNameDimension }; listaFiltroDimensiones.Add(dimension); } conjuntosDimensiones.Add(listaFiltroDimensiones); filtro = new FiltroHechosDto() { IdConcepto = configuracion.IdConceptos, Periodo = periodos, ConjuntosExactosDimensiones = conjuntosDimensiones }; var idsHechos = consultaDocumentoInstanciaUtil.BuscaHechosPorFiltro(filtro); var idsContextos = consultaDocumentoInstanciaUtil.ObtenIdsContextosHechos(idsHechos); foreach (var idContexto in idsContextos) { var contexto = documentoInstancia.ContextosPorId[idContexto]; var listaDimensiones = contexto.ContieneInformacionDimensional ? contexto.ValoresDimension : contexto.Entidad.ContieneInformacionDimensional ? contexto.Entidad.ValoresDimension : new List <DimensionInfoDto>(); var diccionarioDimensionesContexto = new Dictionary <string, string>(); foreach (var dimension in listaDimensiones) { IDictionary <string, DimensionInfoDto> diccionarioMiembros; var idDimension = dimension.IdDimension; if (!miembrosDimension.TryGetValue(idDimension, out diccionarioMiembros)) { diccionarioMiembros = new Dictionary <string, DimensionInfoDto>(); miembrosDimension.Add(idDimension, diccionarioMiembros); } PlantillaDimensionInfoDto plantillaDimension; if (configuracion.PlantillaDimensiones.TryGetValue(idDimension, out plantillaDimension)) { var idMiembro = plantillaDimension.ObtenIdMiembro(dimension); if (!diccionarioMiembros.ContainsKey(idMiembro)) { diccionarioMiembros.Add(idMiembro, dimension); } diccionarioDimensionesContexto.Add(idDimension, idMiembro); } } var idGrupoDimensionesDinamicasBuilder = new StringBuilder(); var grupo = new Dictionary <string, string>(); foreach (var aliasDimensionDinamica in configuracion.DimensionesDinamicas) { string idMiembroDimension; if (diccionarioDimensionesContexto.TryGetValue(aliasDimensionDinamica, out idMiembroDimension)) { idGrupoDimensionesDinamicasBuilder.Append('_'); idGrupoDimensionesDinamicasBuilder.Append(idMiembroDimension); grupo.Add(aliasDimensionDinamica, idMiembroDimension); } } var idGrupoDimesionesDinamicas = idGrupoDimensionesDinamicasBuilder.Length > 1 ? idGrupoDimensionesDinamicasBuilder.ToString().Substring(1) : "indefinida"; if (!gruposDimensionesDinamicas.ContainsKey(idGrupoDimesionesDinamicas)) { gruposDimensionesDinamicas.Add(idGrupoDimesionesDinamicas, grupo); } } }
/// <summary> /// Genera un diccionaro con la información de las personas responsables. /// </summary> /// <param name="estructuraReporte">Estructura del reporte.</param> /// <returns>Diccionario con la información de las personas responsables.</returns> private IDictionary <String, IList <PersonaResponsable431000DTO> > GeneraDiccionarioPersonasResponsables(ReporteXBRLDTO estructuraReporte) { var documentoInstancia = estructuraReporte.Instancia; var consultaUtil = new ConsultaDocumentoInstanciaUtil(documentoInstancia, estructuraReporte.Plantilla); var diccionario = new Dictionary <String, IList <PersonaResponsable431000DTO> >(); var filtroHechos = new FiltroHechosDto() { IdConcepto = new List <String>() { "ar_pros_ResponsiblePersonName", "ar_pros_ResponsiblePersonPosition", "ar_pros_ResponsiblePersonInstitution", "ar_pros_ResponsiblePersonLegend", "ar_pros_SignIssuanceUnderArt13OfTheCUE", "ar_pros_ResponsiblePersonInstitutionExternalAuditor", "ar_pros_OtherInstitutionExternalAuditor", "ar_pros_ResponsiblePersonInstitutionBacherlorOfLaws", "ar_pros_OtherInstitutionBacherlorOfLaws", } }; var diccionarioPersonasResponsables = new Dictionary <String, IList <PersonaResponsable431000DTO> >(); var idsHechosConceptos = consultaUtil.BuscaHechosPorFiltro(filtroHechos); var idsContextos = consultaUtil.ObtenIdsContextosHechos(idsHechosConceptos); var contextosPorFiguraResponsable = consultaUtil.AgrupaContextosPorMiembro("http://www.cnbv.gob.mx/2016-08-22/ar_prospectus:TypeOfResponsibleFigureAxis", idsContextos); foreach (var idItemMiembroFiguraResponsable in contextosPorFiguraResponsable.Keys) { var listaContextosPorFiguraResponsable = contextosPorFiguraResponsable[idItemMiembroFiguraResponsable]; var contextosPorEntidad = consultaUtil.AgrupaContextosPorMiembro("http://www.cnbv.gob.mx/2016-08-22/ar_prospectus:ResponsiblePersonsInstitutionSequenceTypedAxis", listaContextosPorFiguraResponsable); IList <PersonaResponsable431000DTO> listaPersonasResponsablesMiembro; if (!diccionario.TryGetValue(idItemMiembroFiguraResponsable, out listaPersonasResponsablesMiembro)) { listaPersonasResponsablesMiembro = new List <PersonaResponsable431000DTO>(); diccionario.Add(idItemMiembroFiguraResponsable, listaPersonasResponsablesMiembro); } foreach (var miembroTipificadoInstitucion in contextosPorEntidad.Keys) { var personaResponsableDto = new PersonaResponsable431000DTO() { Miembros = new List <PersonaResponsableMiembro431000DTO>() }; listaPersonasResponsablesMiembro.Add(personaResponsableDto); var listaContextosPorInstitucion = contextosPorEntidad[miembroTipificadoInstitucion]; var listaIdsHechosInstitucion = consultaUtil.BuscaHechosPorFiltro(new FiltroHechosDto() { IdConcepto = new List <String>() { "ar_pros_ResponsiblePersonInstitution", "ar_pros_ResponsiblePersonLegend", "ar_pros_ResponsiblePersonInstitutionExternalAuditor", "ar_pros_OtherInstitutionExternalAuditor", "ar_pros_ResponsiblePersonInstitutionBacherlorOfLaws", "ar_pros_OtherInstitutionBacherlorOfLaws" }, IdContexto = listaContextosPorInstitucion }); String otraInstitucion = String.Empty; foreach (var idHechoInstitucion in listaIdsHechosInstitucion) { HechoDto hechoInsititucionLeyenda; if (documentoInstancia.HechosPorId.TryGetValue(idHechoInstitucion, out hechoInsititucionLeyenda)) { if (hechoInsititucionLeyenda.IdConcepto.Equals("ar_pros_ResponsiblePersonInstitution")) { personaResponsableDto.Institucion = hechoInsititucionLeyenda.Valor; } if (hechoInsititucionLeyenda.IdConcepto.Equals("ar_pros_ResponsiblePersonInstitutionExternalAuditor") || hechoInsititucionLeyenda.IdConcepto.Equals("ar_pros_ResponsiblePersonInstitutionBacherlorOfLaws")) { personaResponsableDto.Institucion = hechoInsititucionLeyenda.Valor; } if (hechoInsititucionLeyenda.IdConcepto.Equals("ar_pros_OtherInstitutionExternalAuditor") || hechoInsititucionLeyenda.IdConcepto.Equals("ar_pros_OtherInstitutionBacherlorOfLaws")) { otraInstitucion = hechoInsititucionLeyenda.Valor; } if (hechoInsititucionLeyenda.IdConcepto.Equals("ar_pros_ResponsiblePersonLegend")) { personaResponsableDto.Leyenda = hechoInsititucionLeyenda.Valor; } } } if (!String.IsNullOrEmpty(otraInstitucion) && personaResponsableDto.Institucion.Equals("Otro")) { personaResponsableDto.Institucion = otraInstitucion; } var diccionarioMiembrosPersonasResponsables = consultaUtil.AgrupaContextosPorMiembro("http://www.cnbv.gob.mx/2016-08-22/ar_prospectus:ResponsiblePersonsSequenceTypedAxis", listaContextosPorInstitucion); foreach (var idMiembroResponsable in diccionarioMiembrosPersonasResponsables.Keys) { var listaContextosPersonaResponsable = diccionarioMiembrosPersonasResponsables[idMiembroResponsable]; var idPrimerContexto = listaContextosPersonaResponsable.First(); IList <String> listaIdsHechosPersonaResponsable; if (documentoInstancia.HechosPorIdContexto.TryGetValue(idPrimerContexto, out listaIdsHechosPersonaResponsable)) { var miembroPresonaResponsable = new PersonaResponsableMiembro431000DTO(); for (var indexHechoPresona = 0; indexHechoPresona < listaIdsHechosPersonaResponsable.Count; indexHechoPresona++) { var idHechoPersona = listaIdsHechosPersonaResponsable[indexHechoPresona]; HechoDto hechoPersonaResponsable; if (documentoInstancia.HechosPorId.TryGetValue(idHechoPersona, out hechoPersonaResponsable)) { if (hechoPersonaResponsable.IdConcepto.Equals("ar_pros_ResponsiblePersonName")) { miembroPresonaResponsable.Nombre = hechoPersonaResponsable.Valor; } if (hechoPersonaResponsable.IdConcepto.Equals("ar_pros_ResponsiblePersonPosition")) { miembroPresonaResponsable.Cargo = hechoPersonaResponsable.Valor; } if (hechoPersonaResponsable.IdConcepto.Equals("ar_pros_SignIssuanceUnderArt13OfTheCUE")) { miembroPresonaResponsable.FirmaArticulo13 = hechoPersonaResponsable.Valor.Equals("SI"); if (miembroPresonaResponsable.FirmaArticulo13) { personaResponsableDto.ContieneFirmasLeyendaArt13 = true; } } } } if (!String.IsNullOrEmpty(miembroPresonaResponsable.Nombre)) { personaResponsableDto.Miembros.Add(miembroPresonaResponsable); } } } } } return(diccionario); }