/// <inheritdoc/>
        protected override Act MapToModel(AdverseEvent resource)
        {
#if !DEBUG
            throw new NotSupportedException();
#endif

            var retVal = new Act();

            if (!Guid.TryParse(resource.Id, out var key))
            {
                key = Guid.NewGuid();
            }

            retVal.ClassConceptKey = ActClassKeys.Act;

            //      retVal.StatusConceptKey = StatusKeys.Active;

            retVal.Key = key;

            retVal.MoodConceptKey = ActMoodKeys.Eventoccurrence;

            // map identifier to identifiers
            retVal.Identifiers.Add(DataTypeConverter.ToActIdentifier(resource.Identifier));

            /* retVal.Identifiers = new List<ActIdentifier>
             * {
             *  DataTypeConverter.ToActIdentifier(resource.Identifier)
             * };*/

            //map category to type concept
            retVal.TypeConcept = DataTypeConverter.ToConcept(resource.Category.FirstOrDefault());

            // map subject to patient
            if (resource.Subject != null)
            {
                retVal.Participations.Add(resource.Subject.Reference.StartsWith("urn:uuid:") ? new ActParticipation(ActParticipationKey.RecordTarget, Guid.Parse(resource.Subject.Reference.Substring(9))): new ActParticipation(ActParticipationKey.RecordTarget, DataTypeConverter.ResolveEntity <Core.Model.Roles.Patient>(resource.Subject, resource)));
            }

            // map date element to act time
            var occurTime = (DateTimeOffset)DataTypeConverter.ToDateTimeOffset(resource.DateElement);
            var targetAct = new CodedObservation()
            {
                ActTime = occurTime
            };

            retVal.Relationships.Add(new ActRelationship(ActRelationshipTypeKeys.HasSubject, targetAct));
            retVal.ActTime = occurTime;

            // map event to relationships
            var reactionTarget = new CodedObservation()
            {
                Value = DataTypeConverter.ToConcept(resource.Event)
            };
            targetAct.Relationships.Add(new ActRelationship(ActRelationshipTypeKeys.HasManifestation, reactionTarget));

            // map location to place
            if (resource.Location != null)
            {
                retVal.Participations.Add(resource.Location.Reference.StartsWith("urn:uuid:") ? new ActParticipation(ActParticipationKey.Location, Guid.Parse(resource.Location.Reference.Substring(9))) : new ActParticipation(ActParticipationKey.Location, DataTypeConverter.ResolveEntity <Core.Model.Entities.Place>(resource.Location, resource)));

                // retVal.Participations.Add(new ActParticipation(ActParticipationKey.Location, DataTypeConverter.ResolveEntity<Core.Model.Entities.Place>(resource.Location, resource)));
            }

            // map seriousness to relationships
            if (resource.Severity != null)
            {
                var severityTarget = new CodedObservation()
                {
                    Value = DataTypeConverter.ToConcept(resource.Severity.Coding.FirstOrDefault(), "http://terminology.hl7.org/CodeSystem/adverse-event-severity"), TypeConceptKey = ObservationTypeKeys.Severity
                };
                targetAct.Relationships.Add(new ActRelationship(ActRelationshipTypeKeys.HasComponent, severityTarget));
            }

            // map recoder to provider
            if (resource.Recorder != null)
            {
                retVal.Participations.Add(resource.Recorder.Reference.StartsWith("urn:uuid:") ? new ActParticipation(ActParticipationKey.Authororiginator, Guid.Parse(resource.Recorder.Reference.Substring(9))) : new ActParticipation(ActParticipationKey.Authororiginator, DataTypeConverter.ResolveEntity <Core.Model.Roles.Provider>(resource.Recorder, resource)));

                //  retVal.Participations.Add(new ActParticipation(ActParticipationKey.Authororiginator, DataTypeConverter.ResolveEntity<Core.Model.Roles.Provider>(resource.Recorder, resource)));
            }

            // map outcome to status concept key or relationships

            if (resource.Outcome != null)
            {
                if (resource.Outcome.Coding.Any(o => o.System == "http://hl7.org/fhir/adverse-event-outcome"))
                {
                    if (resource.Outcome.Coding.Any(o => o.Code == "fatal"))
                    {
                        retVal.Relationships.Add(new ActRelationship(ActRelationshipTypeKeys.IsCauseOf, new CodedObservation {
                            TypeConceptKey = ObservationTypeKeys.ClinicalState, ValueKey = Guid.Parse("6df3720b-857f-4ba2-826f-b7f1d3c3adbb")
                        }));
                    }
                    else if (resource.Outcome.Coding.Any(o => o.Code == "ongoing"))
                    {
                        retVal.StatusConceptKey = StatusKeys.Active;
                    }
                    else if (resource.Outcome.Coding.Any(o => o.Code == "resolved"))
                    {
                        retVal.StatusConceptKey = StatusKeys.Completed;
                    }
                }
            }

            //  map instance to relationships and participations
            if (resource.SuspectEntity != null)
            {
                foreach (var component in resource.SuspectEntity)
                {
                    var adm = new SubstanceAdministration();
                    if (component.Instance.GetType() == typeof(Medication))
                    {
                        adm.Participations.Add(component.Instance.Reference.StartsWith("urn:uuid:") ? new ActParticipation(ActParticipationKey.Consumable, Guid.Parse(component.Instance.Reference.Substring(9))) : new ActParticipation(ActParticipationKey.Consumable, DataTypeConverter.ResolveEntity <Core.Model.Entities.ManufacturedMaterial>(component.Instance, resource)));

                        //  adm.Participations.Add(new ActParticipation(ActParticipationKey.Consumable, DataTypeConverter.ResolveEntity<Core.Model.Entities.ManufacturedMaterial>(component.Instance, resource)));

                        retVal.Relationships.Add(new ActRelationship(ActRelationshipTypeKeys.RefersTo, adm));
                    }
                    else if (component.Instance.GetType() == typeof(Substance))
                    {
                        adm.Participations.Add((component.Instance.Reference.StartsWith("urn:uuid:") ? new ActParticipation(ActParticipationKey.Product, Guid.Parse(component.Instance.Reference.Substring(9))) : new ActParticipation(ActParticipationKey.Product, DataTypeConverter.ResolveEntity <Core.Model.Entities.Material>(component.Instance, resource))));

                        //  adm.Participations.Add(new ActParticipation(ActParticipationKey.Product, DataTypeConverter.ResolveEntity<Core.Model.Entities.Material>(component.Instance, resource)));

                        retVal.Relationships.Add(new ActRelationship(ActRelationshipTypeKeys.RefersTo, adm));
                    }
                }
            }
            return(retVal);
        }
Exemple #2
0
 /// <summary>
 /// Insert SBADM
 /// </summary>
 public CodedObservation Insert(CodedObservation data)
 {
     return(this.Insert <CodedObservation>(data));
 }
Exemple #3
0
 /// <summary>
 /// Save sbadm
 /// </summary>
 public CodedObservation Save(CodedObservation data)
 {
     return(this.Save <CodedObservation>(data));
 }
        /// <summary>
        /// Map to model
        /// </summary>
        protected override Core.Model.Acts.Observation MapToModel(Observation resource)
        {
            //value type and value
            Core.Model.Acts.Observation retVal;
            switch (resource.Value)
            {
            case CodeableConcept codeableConcept:
                retVal = new CodedObservation
                {
                    ValueType = "CD",
                    Value     = DataTypeConverter.ToConcept(codeableConcept)
                };
                break;

            case Quantity quantity:
                retVal = new QuantityObservation
                {
                    ValueType     = "PQ",
                    Value         = quantity.Value.Value,
                    UnitOfMeasure = DataTypeConverter.ToConcept(quantity.Unit, "http://hl7.org/fhir/sid/ucum")
                };
                break;

            case FhirString fhirString:
                retVal = new TextObservation
                {
                    ValueType = "ST",
                    Value     = fhirString.Value
                };
                break;

            default:
                retVal = new Core.Model.Acts.Observation();
                break;
            }

            retVal.Extensions  = resource.Extension.Select(DataTypeConverter.ToActExtension).ToList();
            retVal.Identifiers = resource.Identifier.Select(DataTypeConverter.ToActIdentifier).ToList();

            retVal.Key = Guid.TryParse(resource.Id, out var id) ? id : Guid.NewGuid();

            // Observation
            var status = resource.Status;

            //status concept key

            switch (status)
            {
            case ObservationStatus.Preliminary:
                retVal.StatusConceptKey = StatusKeys.Active;
                break;

            case ObservationStatus.Cancelled:
                retVal.StatusConceptKey = StatusKeys.Cancelled;
                break;

            case ObservationStatus.EnteredInError:
                retVal.StatusConceptKey = StatusKeys.Nullified;
                break;

            case ObservationStatus.Final:
                retVal.StatusConceptKey = StatusKeys.Completed;
                break;

            case ObservationStatus.Amended:
            case ObservationStatus.Corrected:
                throw new NotSupportedException(this.m_localizationService.GetString("error.messaging.fhir.observationStatus"));

            case ObservationStatus.Unknown:
                retVal.StatusConceptKey = StatusKeys.Obsolete;
                break;
            }

            //Effective

            switch (resource.Effective)
            {
            case Period period:
                retVal.StartTime = DataTypeConverter.ToDateTimeOffset(period.Start);
                retVal.StopTime  = DataTypeConverter.ToDateTimeOffset(period.End);
                break;

            case FhirDateTime fhirDateTime:
                retVal.ActTime = DataTypeConverter.ToDateTimeOffset(fhirDateTime) ?? DateTimeOffset.MinValue;
                break;
            }


            retVal.TypeConcept = DataTypeConverter.ToConcept(resource.Code);


            //issued
            if (resource.Issued.HasValue)
            {
                retVal.CreationTime = (DateTimeOffset)resource.Issued;
            }

            //interpretation
            if (resource.Interpretation.Any())
            {
                retVal.InterpretationConcept = DataTypeConverter.ToConcept(resource.Interpretation.First());
            }


            //subject

            if (resource.Subject != null)
            {
                // if the subject is a UUID then add the record target key
                // otherwise attempt to resolve the reference
                retVal.Participations.Add(resource.Subject.Reference.StartsWith("urn:uuid:") ?
                                          new ActParticipation(ActParticipationKey.RecordTarget, Guid.Parse(resource.Subject.Reference.Substring(9))) :
                                          new ActParticipation(ActParticipationKey.RecordTarget, DataTypeConverter.ResolveEntity <Core.Model.Roles.Patient>(resource.Subject, resource)));
                //else
                //{
                //    this.m_tracer.TraceError("Only UUID references are supported");
                //    throw new NotSupportedException(this.m_localizationService.FormatString("error.type.NotSupportedException.paramOnlySupported", new
                //    {
                //        param = "UUID"
                //    }));
                //}
            }

            //performer
            if (resource.Performer.Any())
            {
                foreach (var res in resource.Performer)
                {
                    retVal.Participations.Add(res.Reference.StartsWith("urn:uuid:") ?
                                              new ActParticipation(ActParticipationKey.Performer, Guid.Parse(res.Reference.Substring(9))) :
                                              new ActParticipation(ActParticipationKey.Performer, DataTypeConverter.ResolveEntity <Provider>(res, resource)));

                    //if (res.Reference.StartsWith("urn:uuid:"))
                    //{
                    //    retVal.Participations.Add(new ActParticipation(ActParticipationKey.Performer, Guid.Parse(res.Reference.Substring(9))));
                    //}
                    //else
                    //{
                    //    this.m_tracer.TraceError("Only UUID references are supported");
                    //    throw new NotSupportedException(this.m_localizationService.FormatString("error.type.NotSupportedException.paramOnlySupported", new
                    //    {
                    //        param = "UUID"
                    //    }));
                    //}
                }
            }

            // to bypass constraint at function 'CK_IS_CD_SET_MEM'
            retVal.MoodConceptKey = ActMoodKeys.Eventoccurrence;

            return(retVal);
        }