예제 #1
0
        public void TestEscaping()
        {
            var url = new RestUrl("http://www.server.org/fhir");

            url.AddParam("_since", FhirDateTime.Now().Value);

            var output = url.Uri;

            Assert.IsFalse(output.ToString().Contains("+"));    // don't use un-escaped +
        }
예제 #2
0
        public void ValidateChoiceWithConstraints()
        {
            var obs = new Observation()
            {
                Status = Observation.ObservationStatus.Final,
                Code   = new CodeableConcept("http://somesystem.org/codes", "AABB"),
                Meta   = new Meta {
                    Profile = new[] { "http://validationtest.org/fhir/StructureDefinition/WeightHeightObservation" }
                }
            };

            _validator.Settings.Trace = true;

            obs.Value = new FhirString("I should be ok");
            var report = _validator.Validate(obs);

            Assert.True(report.Success);
            Assert.Equal(0, report.Warnings);   // 1 warning about valueset too complex

            obs.Value = FhirDateTime.Now();
            report    = _validator.Validate(obs);
            Assert.False(report.Success);
            Assert.Equal(0, report.Warnings);

            obs.Value = new Quantity(78m, "kg");
            report    = _validator.Validate(obs);
            Assert.True(report.Success);
            Assert.Equal(0, report.Warnings);

            obs.Value = new Quantity(183m, "cm");
            report    = _validator.Validate(obs);
            Assert.True(report.Success);
            Assert.Equal(0, report.Warnings);

            obs.Value = new Quantity(300m, "in");
            report    = _validator.Validate(obs);
            Assert.False(report.Success);
            Assert.Equal(0, report.Warnings);
        }
예제 #3
0
        public void TestUpdateEncounter()
        {
            var patient = new Patient
            {
                Name = new List <HumanName>
                {
                    new HumanName
                    {
                        Given = new List <string>
                        {
                            "Test",
                            "Update"
                        },
                        Family = "Patient"
                    }
                },
                Active  = true,
                Address = new List <Address>
                {
                    new Address
                    {
                        State   = "Ontario",
                        Country = "Canada",
                        Line    = new List <string>
                        {
                            "123 King Street"
                        },
                        City = "Hamilton"
                    }
                }
            };

            var encounter = new Encounter()
            {
                Class  = new Coding("http://santedb.org/conceptset/v3-ActEncounterCode", "HH"),
                Status = Encounter.EncounterStatus.Finished,
                Period = new Period
                {
                    StartElement = FhirDateTime.Now(),
                    EndElement   = FhirDateTime.Now()
                },
            };

            Resource actualPatient;
            Resource actualEncounter;

            TestUtil.CreateAuthority("TEST", "1.2.3.4", "http://santedb.org/fhir/test", "TEST_HARNESS", AUTH);
            using (TestUtil.AuthenticateFhir("TEST_HARNESS", AUTH))
            {
                var patientResourceHandler   = FhirResourceHandlerUtil.GetResourceHandler(ResourceType.Patient);
                var encounterResourceHandler = FhirResourceHandlerUtil.GetResourceHandler(ResourceType.Encounter);

                actualPatient = patientResourceHandler.Create(patient, TransactionMode.Commit);

                encounter.Subject = new ResourceReference($"urn:uuid:{actualPatient.Id}");

                actualEncounter = encounterResourceHandler.Create(encounter, TransactionMode.Commit);
            }

            Assert.NotNull(actualPatient);
            Assert.NotNull(actualEncounter);

            Assert.IsInstanceOf <Patient>(actualPatient);
            Assert.IsInstanceOf <Encounter>(actualEncounter);

            var createdEncounter = (Encounter)actualEncounter;

            Assert.NotNull(createdEncounter);

            createdEncounter.Status = Encounter.EncounterStatus.Cancelled;
            createdEncounter.Class  = new Coding("http://santedb.org/conceptset/v3-ActEncounterCode", "FLD");

            Resource actual;

            using (TestUtil.AuthenticateFhir("TEST_HARNESS", AUTH))
            {
                var encounterResourceHandler = FhirResourceHandlerUtil.GetResourceHandler(ResourceType.Encounter);

                actual = encounterResourceHandler.Update(createdEncounter.Id, createdEncounter, TransactionMode.Commit);
            }

            Assert.NotNull(actual);
            Assert.IsInstanceOf <Encounter>(actual);

            var updatedEncounter = (Encounter)actual;

            Assert.AreEqual(Encounter.EncounterStatus.Cancelled, updatedEncounter.Status);
            Assert.AreEqual("FLD", updatedEncounter.Class.Code);
        }
예제 #4
0
        /// <summary>
        /// Converts a Trifolia ValueSet model to a FHIR ValueSet model.
        /// </summary>
        /// <param name="valueSet">The Trifolia ValueSet model to convert to a FHIR model</param>
        /// <param name="summaryType">Does not populate certain fields when a summaryType is specified.</param>
        /// <param name="publishedValueSets">Optional list of ValueSets that are used by a published implementation guide. If not specified, queries the database for implementation guides that this value set may be published under.</param>
        /// <returns>A FHIR ValueSet model</returns>
        public FhirValueSet Convert(ValueSet valueSet, SummaryType?summaryType = null, IEnumerable <ValueSet> publishedValueSets = null)
        {
            bool usedByPublishedIgs = false;

            if (publishedValueSets == null)
            {
                var implementationGuides = (from tc in valueSet.Constraints
                                            join t in this.tdb.Templates on tc.TemplateId equals t.Id
                                            select t.OwningImplementationGuide);
                usedByPublishedIgs = implementationGuides.Count(y => y.PublishStatus != null && y.PublishStatus.IsPublished) > 0;
            }
            else
            {
                usedByPublishedIgs = publishedValueSets.Contains(valueSet);
            }

            FhirValueSet fhirValueSet = new FhirValueSet()
            {
                Id          = valueSet.GetFhirId(),
                Name        = valueSet.Name,
                Status      = usedByPublishedIgs ? ConformanceResourceStatus.Active : ConformanceResourceStatus.Draft,
                Description = new Markdown(valueSet.Description),
                Url         = valueSet.Oid
            };

            if (summaryType == null || summaryType == SummaryType.Data)
            {
                var activeMembers = valueSet.GetActiveMembers(DateTime.Now);

                if (activeMembers.Count > 0)
                {
                    // Compose
                    var compose = new FhirValueSet.ComposeComponent();
                    fhirValueSet.Compose = compose;

                    foreach (var groupedMember in activeMembers.GroupBy(y => y.CodeSystem, y => y))
                    {
                        var include = new FhirValueSet.ConceptSetComponent();
                        compose.Include.Add(include);

                        include.System = groupedMember.Key.Oid;

                        foreach (var member in groupedMember)
                        {
                            include.Concept.Add(new FhirValueSet.ConceptReferenceComponent()
                            {
                                Code    = member.Code,
                                Display = member.DisplayName
                            });
                        }
                    }

                    // Expansion
                    var expansion = new FhirValueSet.ExpansionComponent();
                    expansion.Identifier   = string.Format("urn:uuid:{0}", Guid.NewGuid());
                    expansion.Timestamp    = FhirDateTime.Now().ToString();
                    fhirValueSet.Expansion = expansion;

                    foreach (ValueSetMember vsMember in activeMembers)
                    {
                        var fhirMember = new FhirValueSet.ContainsComponent()
                        {
                            System  = STU3Helper.FormatIdentifier(vsMember.CodeSystem.Oid),
                            Code    = vsMember.Code,
                            Display = vsMember.DisplayName
                        };

                        expansion.Contains.Add(fhirMember);
                    }
                }
            }

            return(fhirValueSet);
        }
예제 #5
0
        public void WriteMetaData(IKey key, int level, Resource resource)
        {
            if (level == 0)
            {
                document.Write(InternalField.ID, this.RootId);

                string selflink = key.ToUriString();
                document.Write(InternalField.SELFLINK, selflink);

                document.Write(InternalField.JUSTID, key.ResourceId);

                var fdt = resource.Meta.LastUpdated.HasValue ? new FhirDateTime(resource.Meta.LastUpdated.Value) : FhirDateTime.Now();
                Write(InternalField.LASTUPDATED, fdt);

                /*
                 *  //For testing purposes:
                 *  string term = resloc.Id;.
                 *  List<Tag> tags = new List<Tag>() { new Tag(term, "http://tags.hl7.org", "labello"+term) } ;
                 *  tags.ForEach(Collect);
                 * /* */

                // DSTU2: tags
                //if (entry.Tags != null)
                //{
                //    entry.Tags.ToList().ForEach(Collect);
                //}
            }
            else
            {
                string id = resource.Id;
                document.Write(InternalField.ID, this.RootId + "#" + id);
            }

            string category = resource.TypeName;

            //ModelInfo.GetResourceNameForType(resource.GetType()).ToLower();
            document.Write(InternalField.RESOURCE, category);
            document.Write(InternalField.LEVEL, level);
        }
예제 #6
0
        private Timing GetDosageTiming(MedicationEntity entity)
        {
            var timing = new Timing();

            timing.Repeat = new Timing.RepeatComponent();

            try
            {
                entity.Duration = entity.Duration == null ? "1" : entity.Duration;
                var resultDuration = Regex.Match(entity.Duration, @"\d+")?.Value;
                if (!string.IsNullOrEmpty(resultDuration))
                {
                    int intDuration;
                    var isvalid = int.TryParse(resultDuration, out intDuration);
                    if (isvalid)
                    {
                        timing.Repeat.Duration = intDuration;
                    }
                }
                if (entity.Duration.ToLower().Contains("day") || entity.Duration.ToLower().Contains("days"))
                {
                    timing.Repeat.DurationUnit = Timing.UnitsOfTime.D;
                }
                else if (entity.Duration.ToLower().Contains("week") || entity.Duration.ToLower().Contains("weeks"))
                {
                    timing.Repeat.DurationUnit = Timing.UnitsOfTime.Wk;
                }
                else
                {
                    timing.Repeat.DurationUnit = Timing.UnitsOfTime.D;
                }

                if (entity.FrenquencyInDay > 0)
                {
                    timing.Repeat.DurationUnit = Timing.UnitsOfTime.H;
                }

                // timing.Repeat.Count = 1;
                timing.Repeat.Frequency = entity.DurationInNumber;

                timing.Repeat.WhenElement = GetFrequencyTimings(entity);
                try
                {
                    if (timing.Repeat.WhenElement != null)
                    {
                        var intcount = timing.Repeat.WhenElement.Count;
                        timing.Repeat.Period = intcount;
                    }
                }
                catch (Exception)
                {
                    timing.Repeat.Period = 1;
                }
                // timing.EventElement =
                var objMedicineDuration = new Period();
                objMedicineDuration.StartElement = FhirDateTime.Now();
                objMedicineDuration.EndElement   = new FhirDateTime(DateTime.Now.AddDays(entity.DurationInNumber));
                timing.Repeat.Bounds             = objMedicineDuration;

                return(timing);
            }
            catch (System.Exception ex)
            {
                return(null);
            }
        }