Ejemplo n.º 1
0
 /// <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
     };
 }
Ejemplo n.º 2
0
 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);
        }
Ejemplo n.º 4
0
 public GroupStatement(string id, ConceptItem area, ConceptItem concept, ILanguage language)
     : base(id, language)
 {
     Area    = area;
     Concept = concept;
 }
Ejemplo n.º 5
0
        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;
            }
        }
Ejemplo n.º 6
0
 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);
                                }
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 9
0
 public HasSignStatement(string id, ConceptItem concept, ConceptItem sign, ILanguage language)
     : base(id, language)
 {
     Concept = concept;
     Sign    = sign;
 }
Ejemplo n.º 10
0
 public IsStatement(string id, ConceptItem ancestor, ConceptItem descendant, ILanguage language)
     : base(id, language)
 {
     Ancestor   = ancestor;
     Descendant = descendant;
 }