/// <summary> /// Calculates the Concept Detail from Concept Item. /// </summary> /// <param name="conceptItem">The concept item.</param> /// <returns>A concept detail object from a concept item.</returns> private static ConceptDetail ConceptDetailFromConceptItem(ConceptItem conceptItem) { return new ConceptDetail() { SnomedConceptId = conceptItem.SnomedConceptId, FullySpecifiedName = conceptItem.FullySpecifiedName, PreferredTerm = conceptItem.PreferredTerm }; }
public ComparisonStatement(string id, ConceptItem leftValue, ConceptItem rightValue, ConceptItem comparisonSign, ILanguage language) : base(id, language) { LeftValue = leftValue; RightValue = rightValue; ComparisonSign = comparisonSign; }
/// <summary> /// Valida que el hecho sea valido respecto al hipercubo donde se reporta, esta /// función evalúa el contexto y que sus dimensiones sean válidas y correctas respecto a sus dominios /// </summary> /// <param name="hecho">Hecho a validar</param> /// <param name="hipercubo">Hipercubo a evaluar</param> /// <returns></returns> private bool ValidarHechoEnHipercubo(FactItem hecho, Hipercubo hipercubo) { IList <MiembroDimension> valoresDimension = new List <MiembroDimension>(); IList <XmlElement> elementosExtras = new List <XmlElement>(); if (hipercubo.ElementoContexto == TipoElementoContexto.Escenario) { if (hecho.Contexto.Escenario != null) { valoresDimension = hecho.Contexto.Escenario.MiembrosDimension; elementosExtras = hecho.Contexto.Escenario.ElementosAdicionales; } } else { if (hecho.Contexto.Entidad.Segmento != null) { valoresDimension = hecho.Contexto.Entidad.Segmento.MiembrosDimension; elementosExtras = hecho.Contexto.Entidad.Segmento.ElementosAdicionales; } } IList <MiembroDimension> valoresEfectivosDimension = new List <MiembroDimension>(); foreach (var nodoDimension in hipercubo.ListaDimensiones) { //Para cada dimension buscar su valor var valorMiembro = valoresDimension.FirstOrDefault(x => x.Dimension == nodoDimension.ConceptoDimension); if (valorMiembro != null) { //Valor de dimensión encontrada //Dimensión OK //Validar el dominio if (!EsDominioValido(valorMiembro, nodoDimension)) { return(false); } valoresEfectivosDimension.Add(valorMiembro); } else { //El valor de la dimensión no existe, verificar si tiene default para inferirlo ConceptItem dimDefault = hipercubo.ObtenerDimensionDefault(nodoDimension.ConceptoDimension); if (dimDefault != null) { //Verificar si la dimensión default es parte del dominio válido if (nodoDimension.MiembrosDominio.Contains(dimDefault)) { valoresEfectivosDimension.Add(new MiembroDimension(nodoDimension.ConceptoDimension, dimDefault)); } } } } //Contar los valores para las dimensiones if (hipercubo.ListaDimensiones.Count != valoresEfectivosDimension.Count) { return(false); } if (hipercubo.Cerrado) { //Si el hipercubo es cerrado y tiene más información de la que debería if (elementosExtras != null) { if (hipercubo.ListaDimensiones.Count < (valoresDimension.Count + elementosExtras.Count)) { return(false); } } } return(true); }
public GroupStatement(string id, ConceptItem area, ConceptItem concept, ILanguage language) : base(id, language) { Area = area; Concept = concept; }
private void SaveConceptProperties(IObjectRepository tdb, ValueSetMember member, ConceptItem concept) { if (member.Code != concept.Code) { member.Code = concept.Code; } if (member.DisplayName != concept.DisplayName) { member.DisplayName = concept.DisplayName; } CodeSystem foundCodeSystem = tdb.CodeSystems.Single(y => y.Id == concept.CodeSystemId); if (member.CodeSystem != foundCodeSystem) { member.CodeSystem = foundCodeSystem; } if (member.Status != concept.Status) { member.Status = concept.Status; } if (member.StatusDate != concept.StatusDate) { member.StatusDate = concept.StatusDate; } }
public HasPartStatement(string id, ConceptItem whole, ConceptItem part, ILanguage language) : base(id, language) { Whole = whole; Part = part; }
/// <summary> /// Valida la correspondencia entre el tipo de unidad declarada en el hecho y la unidad con la cuál está asociado en un /// documento de instancia /// </summary> /// <param name="hecho">Hecho a validar</param> private void ValidarUnidadDeHeho(Fact hecho) { if (hecho is FactNumericItem) { ConceptItem itemDecl = (ConceptItem)hecho.Concepto; FactNumericItem hechoNumerico = (FactNumericItem)hecho; //Tipo de dato moneda o derivado de moneda: //Debe estar asociado a una unidad con un solo elemento xbrli:measure cuyo Qname sea: //Namespace http://www.xbrl.org/2003/iso4217 y Nombre local sea valido if (itemDecl.EsTipoDatoMonetario) { if (hechoNumerico.Unidad.Tipo == Unit.Medida && hechoNumerico.Unidad.Medidas.Count == 1) { if (EspacioNombresConstantes.ISO_4217_Currency_Namespace.Equals(hechoNumerico.Unidad.Medidas[0].Namespace)) { if (!ValidarCodigoMoneda(hechoNumerico.Unidad.Medidas[0])) { ManejadorErrores.ManejarError(null, "4.8.2 Se encontró un hecho numérico reportado en el documento instancia cuya unidad " + " es de tipo monetaria pero la declaración de moneda no es válida: " + hechoNumerico.Unidad.Medidas[0].LocalName, System.Xml.Schema.XmlSeverityType.Error); } } else { ManejadorErrores.ManejarError(null, "4.8.2 Se encontró un hecho numérico reportado en el documento instancia cuya unidad " + " es de tipo monetaria pero la declaración de medida no tiene el espacio de nombres de http://www.xbrl.org/2003/iso4217. Espacio de Nombres de la Unidad: " + hechoNumerico.Unidad.Medidas[0].Namespace, System.Xml.Schema.XmlSeverityType.Error); } } else { ManejadorErrores.ManejarError(null, "4.8.2 Se encontró un hecho numérico reportado en el documento instancia cuyo tipo es monetaryItemType o derivado y" + " está asociado a una unidad que tiene mas de una medida declarada", System.Xml.Schema.XmlSeverityType.Error); } } //Tipo de dato shares o derivado de shares //Debe estar asociado a una unidad con un solo elemento xbrli:measure cuyo Qname sea: //Nombre local debe ser "shares" y el namespace debe ser http://www.xbrl.org/2003/instance if (itemDecl.EsTipoDatoAcciones) { if (hechoNumerico.Unidad.Tipo == Unit.Medida && hechoNumerico.Unidad.Medidas.Count == 1) { if (EspacioNombresConstantes.InstanceNamespace.Equals(hechoNumerico.Unidad.Medidas[0].Namespace)) { if (!ConstantesGenerales.SHARES_UNIT_LOCAL_NAME.Equals(hechoNumerico.Unidad.Medidas[0].LocalName)) { ManejadorErrores.ManejarError(null, "4.8.2 Se encontró un hecho numérico reportado en el documento instancia cuya unidad " + " es de tipo Acciones pero el nombre de la unidad no es válido, debe ser 'shares': " + hechoNumerico.Unidad.Medidas[0].LocalName, System.Xml.Schema.XmlSeverityType.Error); } } else { ManejadorErrores.ManejarError(null, "4.8.2 Se encontró un hecho numérico reportado en el documento instancia cuya unidad " + " es de tipo Acciones pero la declaración de medida no tiene el espacio de nombres de http://www.xbrl.org/2003/instance. Espacio de Nombres de la Unidad: " + hechoNumerico.Unidad.Medidas[0].Namespace, System.Xml.Schema.XmlSeverityType.Error); } } else { ManejadorErrores.ManejarError(null, "4.8.2 Se encontró un hecho numérico reportado en el documento instancia cuyo tipo es sharesItemType o derivado y" + " está asociado a una unidad que tiene mas de una medida declarada ", System.Xml.Schema.XmlSeverityType.Error); } } //Tipo de dato pure o derivado de pure debe tener una sola medida //Si el espacio de nombres es http://www.xbrl.org/2003/instance entonces //nombre local debe ser "pure" if (itemDecl.EsTipoDatoPuro) { if (hechoNumerico.Unidad.Tipo == Unit.Medida && hechoNumerico.Unidad.Medidas.Count == 1) { if (EspacioNombresConstantes.InstanceNamespace.Equals(hechoNumerico.Unidad.Medidas[0].Namespace)) { if (!ConstantesGenerales.PURE_UNIT_LOCAL_NAME.Equals(hechoNumerico.Unidad.Medidas[0].LocalName)) { ManejadorErrores.ManejarError(null, "4.8.2 Se encontró un hecho numérico reportado en el documento instancia cuya unidad " + " es de tipo Puro pero el nombre de la unidad no es válido, debe ser 'pure': " + hechoNumerico.Unidad.Medidas[0].LocalName, System.Xml.Schema.XmlSeverityType.Error); } } } else { ManejadorErrores.ManejarError(null, "4.8.2 Se encontró un hecho numérico reportado en el documento instancia cuyo tipo es pureItemType o derivado y" + " está asociado a una unidad que tiene mas de una medida declarada ", System.Xml.Schema.XmlSeverityType.Error); } } } if (hecho is FactFractionItem || hecho is FactNumericItem) { Unit unidad = null; if (hecho is FactFractionItem) { unidad = ((FactFractionItem)hecho).Unidad; } if (hecho is FactNumericItem) { unidad = ((FactNumericItem)hecho).Unidad; } // 4.8.3 Evitar que en las unidades de fraction items se repita la misma unidad para numerador y denominador if (unidad.Tipo == Unit.Divisoria) { bool valido = true; foreach (Measure medidaNumerador in unidad.Numerador) { foreach (Measure medidaDenominador in unidad.Denominador) { if (medidaNumerador.Equals(medidaDenominador)) { ManejadorErrores.ManejarError(null, "4.8.3 Se encontró un hechoreportado en el documento instancia que " + " está asociado a una unidad que tiene elementos Measure repetidos en el numerador y denominador.", System.Xml.Schema.XmlSeverityType.Error); valido = false; break; } } if (!valido) { break; } } } } }
/// <summary> /// Valida la consistencia de un conjunto de arcos summation-item /// que aportan a la suma de un concepto /// </summary> /// <param name="arco">Arco a validar</param> private void ValidarSumatoriasDeConcepto(ConceptItem conceptoSumatoria, IList <ArcoCalculo> arcosSumandos) { //Buscar en la lista de hechos todos los conceptos de la sumatoria IList <Fact> hechosAValidar = DocumentoInstancia.ObtenerHechosPorConcepto(conceptoSumatoria); if (hechosAValidar != null) { foreach (FactNumericItem hechoSumatoria in hechosAValidar) { Decimal valorDeSumandos = 0; Boolean tieneSumandosDuplicados = false; Boolean tieneElementosQueContribuyen = false; List <FactNumericItem> sumandos = new List <FactNumericItem>(); //Para validar la sumatoria el elemento de sumatoria no debe ser nil y la precision debe ser diferente que cero y no debe tener hechos duplicados if (!hechoSumatoria.IsNilValue) { if (hechoSumatoria.EsPrecisionEstablecida() && !hechoSumatoria.EsPrecisionInfinita && hechoSumatoria.PrecisionInferida != null && hechoSumatoria.PrecisionInferida == 0) { ManejadorErrores.ManejarError(null, "5.2.5.2 Se encontró un hecho que participa en una verificación de cálculo en arco summation-item " + " cuya precision es '0' por lo tanto el cálculo es inconsistente", System.Xml.Schema.XmlSeverityType.Warning); return; } if (hechoSumatoria.DuplicadoCon != null && hechoSumatoria.DuplicadoCon.Count > 0) { ManejadorErrores.ManejarError(null, "5.2.5.2 Se encontró un hecho que participa en una verificación de cálculo en arco summation-item " + " que tiene duplicidad con otro hechos . No se validará la consistencia de este cálculo", System.Xml.Schema.XmlSeverityType.Warning); continue; } foreach (ArcoCalculo arco in arcosSumandos) { //Procesar elementos de arco foreach (ElementoLocalizable elementoHacia in arco.ElementoHacia) { IList <Fact> elementosSumatoria = DocumentoInstancia.ObtenerHechosPorConcepto((ConceptItem)elementoHacia.Destino); foreach (FactNumericItem hechoSumando in elementosSumatoria) { //Verificar que sean del mismo contexto o equivalente if (!DocumentoInstancia.GruposContextosEquivalentes[hechoSumando.Contexto.Id].Contains(hechoSumatoria.Contexto.Id)) { //Este hecho no contribuye a la sumatoria continue; } //Verificar que sean Unit - equal if (!hechoSumatoria.UnitEquals(hechoSumando)) { //Este hecho no contribuye a la sumatoria continue; } //Verificar que el hecho sumando no tenga duplicados if (hechoSumando.DuplicadoCon != null && hechoSumando.DuplicadoCon.Count > 0) { ManejadorErrores.ManejarError(null, "5.2.5.2 Se encontró un hecho que participa en una verificación de cálculo en arco summation-item " + " que tiene duplicidad con otro hechos. No se validará la consistencia de este cálculo", System.Xml.Schema.XmlSeverityType.Warning); tieneSumandosDuplicados = true; break; } //Que el sumando no tenga valor nil if (hechoSumando.IsNilValue) { continue; } //Si el hecho es un descendiente del padre if (hechoSumatoria.Nodo != null) { /*if (!XmlUtil.EsNodoDescendiente(hechoSumatoria.Nodo.ParentNode ,hechoSumando.Nodo)) * { * //no contribuye * continue; * }*/ //Verficar la precision del sumando if (hechoSumatoria.EsPrecisionEstablecida() && !hechoSumando.EsPrecisionInfinita && hechoSumando.PrecisionInferida != null && hechoSumando.PrecisionInferida == 0) { ManejadorErrores.ManejarError(null, "5.2.5.2 Se encontró un hecho que participa en una verificación de cálculo en arco summation-item " + " cuya precision es '0' por lo tanto el cálculo es inconsistente", System.Xml.Schema.XmlSeverityType.Warning); return; } } //Este hecho participa en la sumatoria como sumando tieneElementosQueContribuyen = true; valorDeSumandos += hechoSumando.ValorRedondeado * arco.Peso; sumandos.Add(hechoSumando); } } } if (tieneElementosQueContribuyen && !tieneSumandosDuplicados) { //comparar el valor con la sumatoria //Aplicar el redondeo de decimales if (hechoSumatoria.ValorRedondeado != hechoSumatoria.Redondear(valorDeSumandos)) { var err = ManejadorErrores.ManejarError(null, "5.2.5.2 Error en Verificación de cálculo: Contexto: " + hechoSumatoria.Contexto.Id + " : " + " Valor de Sumatoria (" + hechoSumatoria.Concepto.Id + ") : " + hechoSumatoria.ValorRedondeado.ToString() + " : Valor Resultado de Sumandos: " + hechoSumatoria.Redondear(valorDeSumandos).ToString(), System.Xml.Schema.XmlSeverityType.Warning); err.IdHechoPrincipal = hechoSumatoria.Id; err.IdHechosRelacionados = new List <String>(); foreach (var sum in sumandos) { err.IdHechosRelacionados.Add(sum.Id); } } } } } } }
public HasSignStatement(string id, ConceptItem concept, ConceptItem sign, ILanguage language) : base(id, language) { Concept = concept; Sign = sign; }
public IsStatement(string id, ConceptItem ancestor, ConceptItem descendant, ILanguage language) : base(id, language) { Ancestor = ancestor; Descendant = descendant; }