/// <summary> /// Realiza la validación de un arco essence-alias respecto al contenido de hechos de un documento de instancia. /// /// </summary> /// <param name="arco">Arco a validar</param> private void ValidarHechosEssenceAlias(ArcoDefinicion arco) { ConceptItem itemDesde = null; ConceptItem itemHacia = null; foreach (ElementoLocalizable desde in arco.ElementoDesde) { if (desde.Destino is ConceptItem) { itemDesde = (ConceptItem)desde.Destino; foreach (ElementoLocalizable hacia in arco.ElementoHacia) { if (hacia.Destino is ConceptItem) { itemHacia = (ConceptItem)hacia.Destino; //Buscar todos los facts que correspondan al elemento desde foreach (Fact hechoEssence in DocumentoInstancia.Hechos.Where(fct => fct.Concepto.Id.Equals(itemDesde.Id))) { foreach (Fact hechoAlias in DocumentoInstancia.Hechos.Where(fct => fct.Concepto.Id.Equals(itemHacia.Id))) { //Validar la pareja de hechos si son consistentes en una relación essence-alias //De acuerdo a la especificación los arcos de essence-alias solo pueden unir conteptos del tipo item y no tuple ValidarParejaHechosEssenceAlias((FactItem)hechoEssence, (FactItem)hechoAlias); } } } } } } }
/// <summary> /// Valida el punto 5.2.6.2.4 de la especificación de XBRL 2.1 donde se describe que la relación /// del tipo requires-elemento implica que si en un documento de instancia existe un hecho /// del elemento desde, entonces al menos un hecho del tipo hacia debe existir también en el documento de instancia /// </summary> /// <param name="arco"></param> private void ValidarHechosRequiresElement(ArcoDefinicion arco) { foreach (ElementoLocalizable desde in arco.ElementoDesde) { foreach (ElementoLocalizable hacia in arco.ElementoHacia) { //Si existe elemento desde IList <Fact> hechoElemento = DocumentoInstancia.ObtenerHechosPorConcepto((Concept)desde.Destino); IList <Fact> hechoRequerido = DocumentoInstancia.ObtenerHechosPorConcepto((Concept)hacia.Destino); if (hechoElemento != null && hechoElemento.Count > 0) { //existe elemento , verificar si existe el requerido if (hechoRequerido == null || hechoRequerido.Count == 0) { ManejadorErrores.ManejarError(null, "5.2.6.2.4 Se encontró un hecho del tipo (" + desde.Destino.Id + ") en el documento de instancia pero no se encontró " + " el hecho requerido (" + hacia.Destino.Id + ") definido en el arco: " + arco.ElementoXML.OuterXml, System.Xml.Schema.XmlSeverityType.Error); } } } } }