/// <summary>
        /// Create original identifier for a link
        /// </summary>
        private void CreateOriginalIdentifier(IDbConnection conn, IDbTransaction tx, decimal identifier, HealthServiceRecordSite healthServiceRecordSite, DomainIdentifier id)
        {
            IDbCommand cmd = DbUtil.CreateCommandStoredProc(conn, tx);

            try
            {
                // Participant
                HealthcareParticipant paticipantComponent = healthServiceRecordSite.Component as HealthcareParticipant;

                cmd.CommandText = "add_link_hc_ptcpt_orig_id";
                cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "hsr_id_in", DbType.Decimal, identifier));
                cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_id_in", DbType.Decimal, paticipantComponent.Id));
                cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_cls_in", DbType.Decimal, (decimal)healthServiceRecordSite.SiteRoleType));
                cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "orig_id_domain_in", DbType.StringFixedLength, id.Domain));
                cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "orig_id_in", DbType.StringFixedLength, (object)id.Identifier ?? DBNull.Value));
                cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "license_ind_in", DbType.Boolean, id.IsLicenseAuthority));

                // Insert
                cmd.ExecuteNonQuery();
            }
            finally
            {
                cmd.Dispose();
            }
        }
Пример #2
0
        /// <summary>
        /// Create a participant component from an organization
        /// </summary>
        private HealthcareParticipant CreateParticipantComponent(MARC.Everest.RMIM.CA.R020403.COCT_MT090102CA.Organization organization, List <IResultDetail> dtls)
        {
            HealthcareParticipant retVal = new HealthcareParticipant();

            retVal.Classifier = HealthcareParticipant.HealthcareParticipantType.Organization;

            // Organization identifier
            if (organization.Id == null || organization.Id.IsNull)
            {
                dtls.Add(new MandatoryElementMissingResultDetail(ResultDetailType.Error, this.m_localeService.GetString("MSGE032"), null));
                return(null);
            }
            retVal.AlternateIdentifiers.Add(new DomainIdentifier()
            {
                Domain     = organization.Id.Root,
                Identifier = organization.Id.Extension
            });

            // Organization name
            if (organization.Name != null)
            {
                retVal.LegalName = new NameSet()
                {
                    Use = NameSet.NameSetUse.Legal
                };
                retVal.LegalName.Parts.Add(new NamePart()
                {
                    Type  = NamePart.NamePartType.Given,
                    Value = organization.Name
                });
            }
            ;

            return(retVal);
        }
Пример #3
0
        /// <summary>
        /// Create a healthcare participant component
        /// </summary>
        private HealthcareParticipant CreateParticipantComponent(MARC.Everest.RMIM.CA.R020403.COCT_MT090102CA.AssignedEntity assignedEntity, List <IResultDetail> dtls)
        {
            // Create healthcare participant
            HealthcareParticipant retVal = new HealthcareParticipant();

            retVal.Classifier = HealthcareParticipant.HealthcareParticipantType.Person;

            // Check for an id
            if (assignedEntity.Id == null || assignedEntity.Id.IsNull)
            {
                dtls.Add(new ResultDetail(ResultDetailType.Error, this.m_localeService.GetString("MSGE02F"), null, null));
                return(null);
            }

            // Identifiers
            retVal.AlternateIdentifiers.AddRange(CreateDomainIdentifierList(assignedEntity.Id, dtls));

            // Name
            if (assignedEntity.AssignedPerson != null && assignedEntity.AssignedPerson.NullFlavor == null &&
                assignedEntity.AssignedPerson.Name != null && !assignedEntity.AssignedPerson.Name.IsNull)
            {
                retVal.LegalName = CreateNameSet(assignedEntity.AssignedPerson.Name, dtls);
            }

            // License number
            if (assignedEntity.AssignedPerson.AsHealthCareProvider != null &&
                assignedEntity.AssignedPerson.AsHealthCareProvider.Id != null &&
                !assignedEntity.AssignedPerson.AsHealthCareProvider.Id.IsNull)
            {
                retVal.AlternateIdentifiers.Add(new DomainIdentifier()
                {
                    Domain             = assignedEntity.AssignedPerson.AsHealthCareProvider.Id.Root,
                    Identifier         = assignedEntity.AssignedPerson.AsHealthCareProvider.Id.Extension,
                    IsLicenseAuthority = true
                });
            }

            // Represented organization
            if (assignedEntity.RepresentedOrganization != null && assignedEntity.RepresentedOrganization.NullFlavor == null)
            {
                HealthcareParticipant ptcpt = CreateParticipantComponent(assignedEntity.RepresentedOrganization, dtls);
                if (ptcpt != null)
                {
                    retVal.Add(ptcpt, "RPO", HealthServiceRecordSiteRoleType.RepresentitiveOf, ptcpt.AlternateIdentifiers);
                }
                else
                {
                    dtls.Add(new ResultDetail(ResultDetailType.Warning, this.m_localeService.GetString("MSGW010"), null, null));
                }
            }

            return(retVal);
        }
        /// <summary>
        /// Link participant to a health service record
        /// </summary>
        private void LinkHealthServiceRecord(IDbConnection conn, IDbTransaction tx, decimal identifier, HealthServiceRecordSite healthServiceRecordSite)
        {
            IDbCommand cmd = DbUtil.CreateCommandStoredProc(conn, tx);

            try
            {
                cmd.CommandText = "link_hc_ptcpt";

                // Represented organization
                HealthcareParticipant paticipantComponent = healthServiceRecordSite.Component as HealthcareParticipant;
                var repOrganizations = from HealthServiceRecordComponent comp in paticipantComponent.Components
                                       where (comp.Site as HealthServiceRecordSite).SiteRoleType == HealthServiceRecordSiteRoleType.RepresentitiveOf
                                       select comp;
                HealthcareParticipant representedOrganization = repOrganizations.Count() > 0 ? repOrganizations.First() as HealthcareParticipant : null;
                if (representedOrganization != null)
                {
                    representedOrganization.Id = Convert.ToDecimal(Persist(conn, tx, representedOrganization, false).Identifier);
                }

                // Parameters
                cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "hsr_id_in", DbType.Decimal, identifier));
                cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_id_in", DbType.Decimal, paticipantComponent.Id));
                cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_cls_in", DbType.Decimal, (decimal)healthServiceRecordSite.SiteRoleType));
                cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_rep_org_id_in", DbType.Decimal, representedOrganization == null ? DBNull.Value : (object)representedOrganization.Id));

                // Insert
                cmd.ExecuteNonQuery();

                // Insert original identifiers
                if (healthServiceRecordSite.OriginalIdentifier != null)
                {
                    foreach (var id in healthServiceRecordSite.OriginalIdentifier)
                    {
                        CreateOriginalIdentifier(conn, tx, identifier, healthServiceRecordSite, id);
                    }
                }
            }
            finally
            {
                cmd.Dispose();
            }
        }
Пример #5
0
        /// <summary>
        /// Create a healthcare participant
        /// </summary>
        /// <param name="p"></param>
        /// <param name="dtls"></param>
        /// <returns></returns>
        private HealthcareParticipant CreateParticipantComponent(MARC.Everest.RMIM.CA.R020403.COCT_MT090502CA.AssignedEntity assignedEntity, List <IResultDetail> dtls)
        {
            // Create the healthcare participant
            HealthcareParticipant retVal = new HealthcareParticipant();

            retVal.Classifier = HealthcareParticipant.HealthcareParticipantType.Organization;

            // Check for id
            if (assignedEntity.RepresentedOrganization == null || assignedEntity.RepresentedOrganization.NullFlavor != null ||
                assignedEntity.RepresentedOrganization.Id == null || assignedEntity.RepresentedOrganization.Id.IsNull)
            {
                dtls.Add(new ResultDetail(ResultDetailType.Error, this.m_localeService.GetString("MSGE02B"), null, null));
                return(null);
            }

            // Add identifier
            retVal.AlternateIdentifiers.Add(new DomainIdentifier()
            {
                Domain     = assignedEntity.RepresentedOrganization.Id.Root,
                Identifier = assignedEntity.RepresentedOrganization.Id.Extension
            });

            // Legal name
            if (assignedEntity.RepresentedOrganization.Name != null &&
                !assignedEntity.RepresentedOrganization.Name.IsNull)
            {
                retVal.LegalName     = new NameSet();
                retVal.LegalName.Use = NameSet.NameSetUse.Legal;
                retVal.LegalName.Parts.Add(new NamePart()
                {
                    Value = assignedEntity.RepresentedOrganization.Name,
                    Type  = NamePart.NamePartType.Given
                });
            }

            return(retVal);
        }
Пример #6
0
        private HealthcareParticipant CreateParticipantComponent(MARC.Everest.RMIM.CA.R020403.COCT_MT090108CA.Organization organization, List <IResultDetail> dtls)
        {
            HealthcareParticipant retVal = new HealthcareParticipant();

            retVal.Classifier = HealthcareParticipant.HealthcareParticipantType.Organization;

            // Organization identifier
            if (organization.Id == null || organization.Id.IsNull)
            {
                dtls.Add(new MandatoryElementMissingResultDetail(ResultDetailType.Error, this.m_localeService.GetString("MSGE032"), null));
                return(null);
            }
            retVal.AlternateIdentifiers.Add(new DomainIdentifier()
            {
                Domain     = organization.Id.Root,
                Identifier = organization.Id.Extension
            });

            // Organization name
            if (organization.Name != null)
            {
                retVal.LegalName = new NameSet()
                {
                    Use = NameSet.NameSetUse.Legal
                };
                retVal.LegalName.Parts.Add(new NamePart()
                {
                    Type  = NamePart.NamePartType.Given,
                    Value = organization.Name
                });
            }
            ;

            // Organization type
            if (organization.AssignedOrganization != null && organization.AssignedOrganization.NullFlavor == null)
            {
                if (organization.AssignedOrganization.Code == null || organization.AssignedOrganization.Code.IsNull)
                {
                    dtls.Add(new ResultDetail(ResultDetailType.Warning, this.m_localeService.GetString("MSGW011"), null, null));
                }
                else
                {
                    retVal.Type = CreateCodeValue <String>(organization.AssignedOrganization.Code, dtls);
                }

                // Telecommunications
                if (organization.AssignedOrganization.Telecom != null && !organization.AssignedOrganization.Telecom.IsEmpty)
                {
                    foreach (var tel in organization.AssignedOrganization.Telecom)
                    {
                        retVal.TelecomAddresses.Add(new TelecommunicationsAddress()
                        {
                            Use   = tel.Use == null ? null : Util.ToWireFormat(tel.Use),
                            Value = tel.Value
                        });
                    }
                }
            }

            return(retVal);
        }
Пример #7
0
        /// <summary>
        /// Create a healthcare participant component
        /// </summary>
        protected HealthcareParticipant CreateParticipantComponent(MARC.Everest.RMIM.CA.R020403.COCT_MT090108CA.AssignedEntity assignedEntity, List <IResultDetail> dtls)
        {
            HealthcareParticipant retVal = new HealthcareParticipant();

            retVal.Classifier = HealthcareParticipant.HealthcareParticipantType.Person;

            // Check for an id
            if (assignedEntity.Id == null || assignedEntity.Id.IsNull)
            {
                dtls.Add(new ResultDetail(ResultDetailType.Error, this.m_localeService.GetString("MSGE02F"), null, null));
                return(null);
            }

            // Identifiers
            retVal.AlternateIdentifiers.AddRange(CreateDomainIdentifierList(assignedEntity.Id, dtls));

            // Name
            if (assignedEntity.AssignedPerson == null || assignedEntity.AssignedPerson.NullFlavor != null)
            {
                dtls.Add(new MandatoryElementMissingResultDetail(ResultDetailType.Error, this.m_localeService.GetString("MSGE030"), null));
                return(null);
            }

            if (assignedEntity.AssignedPerson.Name != null && !assignedEntity.AssignedPerson.Name.IsNull)
            {
                retVal.LegalName = CreateNameSet(assignedEntity.AssignedPerson.Name, dtls);
            }

            // Type
            if (assignedEntity.Code == null || assignedEntity.Code.IsNull)
            {
                dtls.Add(new MandatoryElementMissingResultDetail(ResultDetailType.Error, this.m_localeService.GetString("MSGE031"), null));
                return(null);
            }
            retVal.Type = CreateCodeValue(assignedEntity.Code, dtls);

            // Telecom addresses
            if (assignedEntity.Telecom != null && !assignedEntity.Telecom.IsEmpty)
            {
                foreach (var telecom in assignedEntity.Telecom)
                {
                    retVal.TelecomAddresses.Add(new TelecommunicationsAddress()
                    {
                        Use   = telecom.Use == null ? null : Util.ToWireFormat(telecom.Use),
                        Value = telecom.Value
                    });
                }
            }

            // License number
            if (assignedEntity.AssignedPerson.AsHealthCareProvider != null &&
                assignedEntity.AssignedPerson.AsHealthCareProvider.Id != null &&
                !assignedEntity.AssignedPerson.AsHealthCareProvider.Id.IsNull)
            {
                retVal.AlternateIdentifiers.Add(new DomainIdentifier()
                {
                    Domain             = assignedEntity.AssignedPerson.AsHealthCareProvider.Id.Root,
                    Identifier         = assignedEntity.AssignedPerson.AsHealthCareProvider.Id.Extension,
                    IsLicenseAuthority = true
                });
            }

            // Represented organization
            if (assignedEntity.RepresentedOrganization != null && assignedEntity.RepresentedOrganization.NullFlavor == null)
            {
                HealthcareParticipant ptcpt = CreateParticipantComponent(assignedEntity.RepresentedOrganization, dtls);
                if (ptcpt != null)
                {
                    retVal.Add(ptcpt, "RPO", HealthServiceRecordSiteRoleType.RepresentitiveOf, ptcpt.AlternateIdentifiers);
                }
                else
                {
                    dtls.Add(new ResultDetail(ResultDetailType.Warning, this.m_localeService.GetString("MSGW010"), null, null));
                }
            }

            return(retVal);
        }
Пример #8
0
        /// <summary>
        /// Create a healthcare participant component
        /// </summary>
        protected HealthcareParticipant CreateParticipantComponent(MARC.Everest.RMIM.CA.R020403.COCT_MT090508CA.AssignedEntity assignedEntity, List <IResultDetail> dtls)
        {
            HealthcareParticipant retVal = new HealthcareParticipant();

            retVal.Classifier = HealthcareParticipant.HealthcareParticipantType.Organization;

            // Check for id
            if (assignedEntity.RepresentedOrganization == null || assignedEntity.RepresentedOrganization.NullFlavor != null ||
                assignedEntity.RepresentedOrganization.Id == null || assignedEntity.RepresentedOrganization.Id.IsNull)
            {
                dtls.Add(new ResultDetail(ResultDetailType.Error, this.m_localeService.GetString("MSGE02B"), null, null));
                return(null);
            }

            // Add identifier
            retVal.AlternateIdentifiers.Add(new DomainIdentifier()
            {
                Domain     = assignedEntity.RepresentedOrganization.Id.Root,
                Identifier = assignedEntity.RepresentedOrganization.Id.Extension
            });

            // Legal name
            if (assignedEntity.RepresentedOrganization.Name != null &&
                !assignedEntity.RepresentedOrganization.Name.IsNull)
            {
                retVal.LegalName     = new NameSet();
                retVal.LegalName.Use = NameSet.NameSetUse.Legal;
                retVal.LegalName.Parts.Add(new NamePart()
                {
                    Value = assignedEntity.RepresentedOrganization.Name,
                    Type  = NamePart.NamePartType.Given
                });
            }

            // Organization type
            if (assignedEntity.RepresentedOrganization.AssignedOrganization != null &&
                assignedEntity.RepresentedOrganization.AssignedOrganization.NullFlavor == null)
            {
                if (assignedEntity.RepresentedOrganization.AssignedOrganization.Code == null || assignedEntity.RepresentedOrganization.AssignedOrganization.Code.IsNull)
                {
                    dtls.Add(new ResultDetail(ResultDetailType.Warning, this.m_localeService.GetString("MSGW00F"), null, null));
                }
                else
                {
                    retVal.Type = CreateCodeValue <String>(assignedEntity.RepresentedOrganization.AssignedOrganization.Code, dtls);
                }

                // Telecommunications
                if (assignedEntity.RepresentedOrganization.AssignedOrganization.Telecom != null &&
                    !assignedEntity.RepresentedOrganization.AssignedOrganization.Telecom.IsEmpty)
                {
                    foreach (var tel in assignedEntity.RepresentedOrganization.AssignedOrganization.Telecom)
                    {
                        retVal.TelecomAddresses.Add(new TelecommunicationsAddress()
                        {
                            Use   = tel.Use == null ? null : Util.ToWireFormat(tel.Use),
                            Value = tel.Value
                        });
                    }
                }
            }

            return(retVal);
        }
        public override SVC.Messaging.FHIR.Resources.ResourceBase ProcessComponent(System.ComponentModel.IComponent component, List <Everest.Connectors.IResultDetail> dtls)
        {
            // Create a component
            HealthcareParticipant ptcpt = component as HealthcareParticipant;

            if (ptcpt.Classifier != HealthcareParticipant.HealthcareParticipantType.Organization)
            {
                ; // Not an organization pass off
            }
            // Organization
            Organization retVal = new Organization();

            retVal.Id        = ptcpt.Id.ToString();
            retVal.VersionId = ptcpt.Id.ToString();

            // Other identifiers
            foreach (var id in ptcpt.AlternateIdentifiers)
            {
                retVal.Extension.Add(ExtensionUtil.CreateIdentificationExtension(id));
            }

            if (ptcpt.Type != null)
            {
                retVal.Type = base.ConvertCode(ptcpt.Type);
            }

            retVal.Name   = ptcpt.LegalName.Parts[0].Value;
            retVal.Active = true;

            // Address
            if (ptcpt.PrimaryAddress != null)
            {
                retVal.Address = base.ConvertAddressSet(ptcpt.PrimaryAddress);
            }

            // Telecoms
            if (ptcpt.TelecomAddresses != null)
            {
                foreach (var tel in ptcpt.TelecomAddresses)
                {
                    retVal.Telecom.AddRange(base.ConvertTelecom(tel));
                }
            }

            var contacts = ptcpt.FindAllComponents(SVC.Core.ComponentModel.HealthServiceRecordSiteRoleType.RepresentitiveOf);

            foreach (HealthcareParticipant contact in contacts)
            {
                ContactEntity ce = new ContactEntity();

                // Link
                var processor     = FhirMessageProcessorUtil.GetComponentProcessor(contact.GetType());
                var processResult = processor.ProcessComponent(contact, dtls);

                if (processResult is Practictioner)
                {
                    var prac = processResult as Practictioner;
                    ce.Name    = prac.Name[0];
                    ce.Address = prac.Address[0];
                    ce.Gender  = prac.Gender;
                    ce.Telecom = prac.Telecom;
                }

                if (ce.Name != null)
                {
                    ce.Name = base.ConvertNameSet(contact.LegalName);
                }
                if (contact.TelecomAddresses != null)
                {
                    foreach (var t in contact.TelecomAddresses)
                    {
                        ce.Telecom.AddRange(base.ConvertTelecom(t));
                    }
                }
                if (contact.PrimaryAddress != null)
                {
                    ce.Address = base.ConvertAddressSet(contact.PrimaryAddress)[0];
                }

                retVal.ContactEntity.Add(ce);
            }

            return(retVal);
        }
Пример #10
0
        /// <summary>
        /// Create audit data
        /// </summary>
        public AuditData CreateAuditData(string itiName, ActionType action, OutcomeIndicator outcome, UnsolicitedDataEventArgs msgEvent, IReceiveResult msgReceiveResult, IEnumerable <VersionedDomainIdentifier> patientRecord, HealthcareParticipant author)
        {
            // Audit data
            AuditData retVal = null;

            AuditableObjectLifecycle lifecycle = AuditableObjectLifecycle.Access;
            var wcfReceiveResult = msgReceiveResult as WcfReceiveResult;
            var msgReplyTo       = wcfReceiveResult == null || wcfReceiveResult.Headers == null || wcfReceiveResult.Headers.ReplyTo == null?msgEvent.SolicitorEndpoint.ToString() : wcfReceiveResult.Headers.ReplyTo.Uri.ToString();

            string userId = String.Empty;

            if (OperationContext.Current.Channel.RemoteAddress != null && OperationContext.Current.Channel.RemoteAddress.Uri != null)
            {
                userId = OperationContext.Current.Channel.RemoteAddress.Uri.OriginalString;
            }
            else if (OperationContext.Current.ServiceSecurityContext != null && OperationContext.Current.ServiceSecurityContext.PrimaryIdentity != null)
            {
                userId = OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name;
            }


            switch (itiName)
            {
            case "PRPA_TE101103CA":
            {
                retVal = new AuditData(DateTime.Now, action, outcome, EventIdentifierType.PatientRecord, new CodeValue(itiName, "HL7 Trigger Events"));

                // Audit actor for Patient Identity Source
                retVal.Actors.Add(new AuditActorData()
                    {
                        UserIsRequestor = true,
                        UserIdentifier  = msgReplyTo,
                        ActorRoleCode   = new List <CodeValue>()
                        {
                            new  CodeValue("110153", "DCM")
                            {
                                DisplayName = "Source"
                            }
                        },
                        NetworkAccessPointId   = msgEvent.SolicitorEndpoint.Host,
                        NetworkAccessPointType = msgEvent.SolicitorEndpoint.HostNameType == UriHostNameType.Dns ? NetworkAccessPointType.MachineName : NetworkAccessPointType.IPAddress,
                        UserName = userId
                    });
                // Audit actor for PIX manager
                retVal.Actors.Add(new AuditActorData()
                    {
                        UserIdentifier  = msgEvent.ReceiveEndpoint.ToString(),
                        UserIsRequestor = false,
                        ActorRoleCode   = new List <CodeValue>()
                        {
                            new CodeValue("110152", "DCM")
                            {
                                DisplayName = "Destination"
                            }
                        },
                        NetworkAccessPointType = NetworkAccessPointType.MachineName,
                        NetworkAccessPointId   = Dns.GetHostName(),
                        AlternativeUserId      = Process.GetCurrentProcess().Id.ToString()
                    });


                var request = msgReceiveResult.Structure as MARC.Everest.RMIM.CA.R020403.Interactions.PRPA_IN101103CA;
                retVal.AuditableObjects.Add(new AuditableObject()
                    {
                        Type       = AuditableObjectType.SystemObject,
                        Role       = AuditableObjectRole.Query,
                        IDTypeCode = AuditableObjectIdType.SearchCritereon,
                        QueryData  = Convert.ToBase64String(SerializeQuery(request.controlActEvent.QueryByParameter)),
                        ObjectId   = String.Format("{1}^^^&{0}&ISO", request.controlActEvent.QueryByParameter.QueryId.Root, request.controlActEvent.QueryByParameter.QueryId.Extension)
                    });

                break;
            }

            case "PRPA_TE101101CA":
            {
                retVal = new AuditData(DateTime.Now, action, outcome, EventIdentifierType.PatientRecord, new CodeValue(itiName, "HL7 Trigger Events"));

                // Audit actor for Patient Identity Source
                retVal.Actors.Add(new AuditActorData()
                    {
                        UserIsRequestor = true,
                        UserIdentifier  = msgReplyTo,
                        ActorRoleCode   = new List <CodeValue>()
                        {
                            new  CodeValue("110153", "DCM")
                            {
                                DisplayName = "Source"
                            }
                        },
                        NetworkAccessPointId   = msgEvent.SolicitorEndpoint.Host,
                        NetworkAccessPointType = msgEvent.SolicitorEndpoint.HostNameType == UriHostNameType.Dns ? NetworkAccessPointType.MachineName : NetworkAccessPointType.IPAddress,
                        UserName = userId
                    });
                // Audit actor for PIX manager
                retVal.Actors.Add(new AuditActorData()
                    {
                        UserIdentifier  = msgEvent.ReceiveEndpoint.ToString(),
                        UserIsRequestor = false,
                        ActorRoleCode   = new List <CodeValue>()
                        {
                            new CodeValue("110152", "DCM")
                            {
                                DisplayName = "Destination"
                            }
                        },
                        NetworkAccessPointType = NetworkAccessPointType.MachineName,
                        NetworkAccessPointId   = Dns.GetHostName(),
                        AlternativeUserId      = Process.GetCurrentProcess().Id.ToString()
                    });


                var request = msgReceiveResult.Structure as MARC.Everest.RMIM.CA.R020403.Interactions.PRPA_IN101101CA;
                retVal.AuditableObjects.Add(new AuditableObject()
                    {
                        Type       = AuditableObjectType.SystemObject,
                        Role       = AuditableObjectRole.Query,
                        IDTypeCode = AuditableObjectIdType.SearchCritereon,
                        QueryData  = Convert.ToBase64String(SerializeQuery(request.controlActEvent.QueryByParameter)),
                        ObjectId   = String.Format("{1}^^^&{0}&ISO", request.controlActEvent.QueryByParameter.QueryId.Root, request.controlActEvent.QueryByParameter.QueryId.Extension)
                    });

                break;
            }

            case "PRPA_TE101201CA":
            {
                retVal = new AuditData(DateTime.Now, action, outcome, EventIdentifierType.PatientRecord, new CodeValue(itiName, "HL7 Trigger Events"));

                // Audit actor for Patient Identity Source
                retVal.Actors.Add(new AuditActorData()
                    {
                        UserIsRequestor = true,
                        UserIdentifier  = msgReplyTo,
                        ActorRoleCode   = new List <CodeValue>()
                        {
                            new  CodeValue("110153", "DCM")
                            {
                                DisplayName = "Source"
                            }
                        },
                        NetworkAccessPointId   = msgEvent.SolicitorEndpoint.Host,
                        NetworkAccessPointType = msgEvent.SolicitorEndpoint.HostNameType == UriHostNameType.Dns ? NetworkAccessPointType.MachineName : NetworkAccessPointType.IPAddress,
                        UserName = userId
                    });
                // Audit actor for PIX manager
                retVal.Actors.Add(new AuditActorData()
                    {
                        UserIdentifier  = msgEvent.ReceiveEndpoint.ToString(),
                        UserIsRequestor = false,
                        ActorRoleCode   = new List <CodeValue>()
                        {
                            new CodeValue("110152", "DCM")
                            {
                                DisplayName = "Destination"
                            }
                        },
                        NetworkAccessPointType = NetworkAccessPointType.MachineName,
                        NetworkAccessPointId   = Dns.GetHostName(),
                        AlternativeUserId      = Process.GetCurrentProcess().Id.ToString()
                    });


                break;
            }

            case "PRPA_TE101105CA":
            {
                retVal = new AuditData(DateTime.Now, action, outcome, EventIdentifierType.PatientRecord, new CodeValue(itiName, "HL7 Trigger Events"));

                // Audit actor for Patient Identity Source
                retVal.Actors.Add(new AuditActorData()
                    {
                        UserIsRequestor = true,
                        UserIdentifier  = msgReplyTo,
                        ActorRoleCode   = new List <CodeValue>()
                        {
                            new  CodeValue("110153", "DCM")
                            {
                                DisplayName = "Source"
                            }
                        },
                        NetworkAccessPointId   = msgEvent.SolicitorEndpoint.Host,
                        NetworkAccessPointType = msgEvent.SolicitorEndpoint.HostNameType == UriHostNameType.Dns ? NetworkAccessPointType.MachineName : NetworkAccessPointType.IPAddress,
                        UserName = userId
                    });
                // Audit actor for PIX manager
                retVal.Actors.Add(new AuditActorData()
                    {
                        UserIdentifier  = msgEvent.ReceiveEndpoint.ToString(),
                        UserIsRequestor = false,
                        ActorRoleCode   = new List <CodeValue>()
                        {
                            new CodeValue("110152", "DCM")
                            {
                                DisplayName = "Destination"
                            }
                        },
                        NetworkAccessPointType = NetworkAccessPointType.MachineName,
                        NetworkAccessPointId   = Dns.GetHostName(),
                        AlternativeUserId      = Process.GetCurrentProcess().Id.ToString()
                    });


                var request = msgReceiveResult.Structure as MARC.Everest.RMIM.CA.R020403.Interactions.PRPA_IN101105CA;
                retVal.AuditableObjects.Add(new AuditableObject()
                    {
                        Type       = AuditableObjectType.SystemObject,
                        Role       = AuditableObjectRole.Query,
                        IDTypeCode = AuditableObjectIdType.SearchCritereon,
                        QueryData  = Convert.ToBase64String(SerializeQuery(request.controlActEvent.QueryByParameter)),
                        ObjectId   = String.Format("{1}^^^&{0}&ISO", request.controlActEvent.QueryByParameter.QueryId.Root, request.controlActEvent.QueryByParameter.QueryId.Extension)
                    });

                break;

                break;
            }

            case "ITI-44":
                retVal = new AuditData(DateTime.Now, action, outcome, EventIdentifierType.PatientRecord, new CodeValue(itiName, "IHE Transactions"));

                // Audit actor for Patient Identity Source
                retVal.Actors.Add(new AuditActorData()
                {
                    UserIsRequestor = true,
                    UserIdentifier  = msgReplyTo,
                    ActorRoleCode   = new List <CodeValue>()
                    {
                        new  CodeValue("110153", "DCM")
                        {
                            DisplayName = "Source"
                        }
                    },
                    NetworkAccessPointId   = msgEvent.SolicitorEndpoint.Host,
                    NetworkAccessPointType = msgEvent.SolicitorEndpoint.HostNameType == UriHostNameType.Dns ? NetworkAccessPointType.MachineName : NetworkAccessPointType.IPAddress,
                    UserName = userId
                });
                // Audit actor for PIX manager
                retVal.Actors.Add(new AuditActorData()
                {
                    UserIdentifier  = msgEvent.ReceiveEndpoint.ToString(),
                    UserIsRequestor = false,
                    ActorRoleCode   = new List <CodeValue>()
                    {
                        new CodeValue("110152", "DCM")
                        {
                            DisplayName = "Destination"
                        }
                    },
                    NetworkAccessPointType = NetworkAccessPointType.MachineName,
                    NetworkAccessPointId   = Dns.GetHostName(),
                    AlternativeUserId      = Process.GetCurrentProcess().Id.ToString()
                });
                break;

            case "ITI-45":
            {
                retVal = new AuditData(DateTime.Now, ActionType.Execute, outcome, EventIdentifierType.Query, new CodeValue("ITI-45", "IHE Transactions")
                    {
                        DisplayName = "PIX Query"
                    });
                // Audit actor for Patient Identity Source
                retVal.Actors.Add(new AuditActorData()
                    {
                        UserIsRequestor = true,
                        UserIdentifier  = msgReplyTo,
                        ActorRoleCode   = new List <CodeValue>()
                        {
                            new  CodeValue("110153", "DCM")
                            {
                                DisplayName = "Source"
                            }
                        },
                        NetworkAccessPointId   = msgEvent.SolicitorEndpoint.Host,
                        NetworkAccessPointType = msgEvent.SolicitorEndpoint.HostNameType == UriHostNameType.Dns ? NetworkAccessPointType.MachineName : NetworkAccessPointType.IPAddress,
                        UserName = userId
                    });
                // Audit actor for PIX manager
                retVal.Actors.Add(new AuditActorData()
                    {
                        UserIdentifier  = msgEvent.ReceiveEndpoint.ToString(),
                        UserIsRequestor = false,
                        ActorRoleCode   = new List <CodeValue>()
                        {
                            new CodeValue("110152", "DCM")
                            {
                                DisplayName = "Destination"
                            }
                        },
                        NetworkAccessPointType = NetworkAccessPointType.MachineName,
                        NetworkAccessPointId   = Dns.GetHostName(),
                        AlternativeUserId      = Process.GetCurrentProcess().Id.ToString()
                    });

                // Add query
                var request = msgReceiveResult.Structure as PRPA_IN201309UV02;

                retVal.AuditableObjects.Add(new AuditableObject()
                    {
                        Type             = AuditableObjectType.SystemObject,
                        Role             = AuditableObjectRole.Query,
                        IDTypeCode       = AuditableObjectIdType.Custom,
                        CustomIdTypeCode = new CodeValue("ITI45", "IHE Transactions"),
                        QueryData        = Convert.ToBase64String(SerializeQuery(request.controlActProcess.queryByParameter)),
                        ObjectId         = String.Format("{1}^^^&{0}&ISO", request.controlActProcess.queryByParameter.QueryId.Root, request.controlActProcess.queryByParameter.QueryId.Extension)
                    });

                break;
            }

            case "ITI-47":
            {
                retVal = new AuditData(DateTime.Now, ActionType.Execute, outcome, EventIdentifierType.Query, new CodeValue("ITI-47", "IHE Transactions")
                    {
                        DisplayName = "Patient Demographics Query"
                    });
                // Audit actor for Patient Identity Source
                retVal.Actors.Add(new AuditActorData()
                    {
                        UserIsRequestor = true,
                        UserIdentifier  = msgReplyTo,
                        ActorRoleCode   = new List <CodeValue>()
                        {
                            new  CodeValue("110153", "DCM")
                            {
                                DisplayName = "Source"
                            }
                        },
                        NetworkAccessPointId   = msgEvent.SolicitorEndpoint.Host,
                        NetworkAccessPointType = msgEvent.SolicitorEndpoint.HostNameType == UriHostNameType.Dns ? NetworkAccessPointType.MachineName : NetworkAccessPointType.IPAddress,
                        UserName = userId
                    });
                // Audit actor for PIX manager
                retVal.Actors.Add(new AuditActorData()
                    {
                        UserIdentifier  = msgEvent.ReceiveEndpoint.ToString(),
                        UserIsRequestor = false,
                        ActorRoleCode   = new List <CodeValue>()
                        {
                            new CodeValue("110152", "DCM")
                            {
                                DisplayName = "Destination"
                            }
                        },
                        NetworkAccessPointType = NetworkAccessPointType.MachineName,
                        NetworkAccessPointId   = Dns.GetHostName(),
                        AlternativeUserId      = Process.GetCurrentProcess().Id.ToString()
                    });

                // Add query
                var request = msgReceiveResult.Structure as PRPA_IN201305UV02;

                retVal.AuditableObjects.Add(new AuditableObject()
                    {
                        Type             = AuditableObjectType.SystemObject,
                        Role             = AuditableObjectRole.Query,
                        IDTypeCode       = AuditableObjectIdType.Custom,
                        CustomIdTypeCode = new CodeValue("ITI47", "IHE Transactions"),
                        QueryData        = Convert.ToBase64String(SerializeQuery(request.controlActProcess.queryByParameter)),
                        ObjectId         = String.Format("{1}^^^&{0}&ISO", request.controlActProcess.queryByParameter.QueryId.Root, request.controlActProcess.queryByParameter.QueryId.Extension)
                    });

                break;
            }
            }

            // Audit authors
            if (author != null)
            {
                retVal.AuditableObjects.Add(new AuditableObject()
                {
                    IDTypeCode    = AuditableObjectIdType.UserIdentifier,
                    ObjectId      = String.Format("{1}^^^&{0}&ISO", this.m_configService.OidRegistrar.GetOid("CR_PID"), author.Id),
                    Role          = AuditableObjectRole.Provider,
                    Type          = AuditableObjectType.Person,
                    LifecycleType = (AuditableObjectLifecycle?)(action == ActionType.Read ? (object)AuditableObjectLifecycle.ReceiptOfDisclosure : null)
                });
            }
            // Audit patients
            foreach (var pat in patientRecord)
            {
                // Construct the audit object
                AuditableObject aud = new AuditableObject()
                {
                    IDTypeCode = AuditableObjectIdType.PatientNumber,
                    Role       = AuditableObjectRole.Patient,
                    Type       = AuditableObjectType.Person
                };

                // Lifecycle
                switch (action)
                {
                case ActionType.Create:
                    aud.LifecycleType = AuditableObjectLifecycle.Creation;
                    break;

                case ActionType.Delete:
                    aud.LifecycleType = AuditableObjectLifecycle.LogicalDeletion;
                    break;

                case ActionType.Execute:
                    aud.LifecycleType = AuditableObjectLifecycle.Access;
                    break;

                case ActionType.Read:
                    aud.LifecycleType = AuditableObjectLifecycle.Disclosure;
                    break;

                case ActionType.Update:
                    aud.LifecycleType = AuditableObjectLifecycle.Amendment;
                    break;
                }

                aud.ObjectId = String.Format("{1}^^^&{0}&ISO", pat.Domain, pat.Identifier);
                retVal.AuditableObjects.Add(aud);
            }
            return(retVal);
        }
Пример #11
0
        /// <summary>
        /// Create audit data that is in response to a query
        /// </summary>
        internal AuditData CreateAuditData(string itiName, ActionType actionType, OutcomeIndicator outcomeIndicator, UnsolicitedDataEventArgs msgEvent, IReceiveResult msgReceiveResult, RegistryQueryResult result, HealthcareParticipant author)
        {
            // Create the call to the other create audit data message by constructing the list of disclosed identifiers
            List <VersionedDomainIdentifier> vids = new List <VersionedDomainIdentifier>(result.Results.Count);

            foreach (var res in result.Results)
            {
                if (res == null)
                {
                    continue;
                }
                var subj = res.FindComponent(SVC.Core.ComponentModel.HealthServiceRecordSiteRoleType.SubjectOf) as Person;
                if (subj == null)
                {
                    continue;
                }
                vids.Add(new VersionedDomainIdentifier()
                {
                    Domain     = this.m_configService.OidRegistrar.GetOid("CR_CID").Oid,
                    Identifier = subj.Id.ToString()
                });
            }

            return(CreateAuditData(itiName, actionType, outcomeIndicator, msgEvent, msgReceiveResult, vids, author));
        }
        /// <summary>
        /// De-persist
        /// </summary>
        public System.ComponentModel.IComponent DePersist(System.Data.IDbConnection conn, decimal identifier, IContainer container, HealthServiceRecordSiteRoleType?roleType, bool loadFast)
        {
            HealthcareParticipant retVal = new HealthcareParticipant();

            IDbCommand cmd = DbUtil.CreateCommandStoredProc(conn, null);

            try
            {
                // Determine the container
                RegistrationEvent hsrParent = container as RegistrationEvent;

                retVal = GetProvider(conn, null, new DomainIdentifier()
                {
                    Identifier = identifier.ToString()
                });

                // Data reader
                if (hsrParent != null)
                {
                    cmd.CommandText = "get_hsr_ptcpt";
                    cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "hsr_id_in", DbType.Decimal, hsrParent.Id));
                    //cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "vrsn_id_in", DbType.Decimal, hsrParent.VersionIdentifier));
                    cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_id_in", DbType.Decimal, identifier));
                    cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_cls_in", DbType.Decimal, (decimal)roleType.Value));

                    // Role
                    Decimal repOrgId = default(decimal);
                    List <DomainIdentifier> originalIds = new List <DomainIdentifier>();

                    // Execute a reader
                    IDataReader reader = cmd.ExecuteReader();
                    try
                    {
                        // Read a row
                        while (reader.Read())
                        {
                            repOrgId = reader["ptcpt_rep_org_id"] == DBNull.Value ? default(decimal) : Convert.ToDecimal(reader["ptcpt_rep_org_id"]);
                            originalIds.Add(new DomainIdentifier()
                            {
                                Domain             = Convert.ToString(reader["orig_id_domain"]),
                                Identifier         = Convert.ToString(reader["orig_id"]),
                                IsLicenseAuthority = Convert.ToBoolean(reader["license_ind"])
                            });
                        }
                    }
                    finally
                    {
                        reader.Close();
                    }

                    // Representative of
                    if (repOrgId != default(decimal))
                    {
                        retVal.Add(GetProvider(conn, null, new DomainIdentifier()
                        {
                            Identifier = repOrgId.ToString()
                        }), "REPOF", HealthServiceRecordSiteRoleType.RepresentitiveOf, null);
                    }

                    // Add to parent
                    hsrParent.Add(retVal, Guid.NewGuid().ToString(), roleType.Value, originalIds);
                }
                else if (container != null)
                {
                    container.Add(retVal);
                }
            }
            finally
            {
                cmd.Dispose();
            }

            // TODO: Get original identifiers for this link

            return(retVal);
        }
        /// <summary>
        /// Persist an object
        /// </summary>
        public VersionedDomainIdentifier Persist(System.Data.IDbConnection conn, System.Data.IDbTransaction tx, System.ComponentModel.IComponent data, bool isUpdate)
        {
            ISystemConfigurationService configServce = ApplicationContext.ConfigurationService; //ApplicationContext.Current.GetService(typeof(ISystemConfigurationService)) as ISystemConfigurationService;

            // First, we must determine if we're going to be performing an update or a put
            HealthcareParticipant ptcpt = data as HealthcareParticipant;

            // Do we have the shrid?
            if (ptcpt.Id == default(decimal) && ptcpt.AlternateIdentifiers.Count > 0) // nope
            {
                // Attempt to get the SHRID
                int iId = 0;
                HealthcareParticipant resPtcpt = null;
                while (resPtcpt == null && iId < ptcpt.AlternateIdentifiers.Count)
                {
                    resPtcpt = GetProvider(conn, tx, ptcpt.AlternateIdentifiers[iId]);
                    iId++;
                }

                if (resPtcpt == null && !DatabasePersistenceService.ValidationSettings.PersonsMustExist) // We need to create a client
                {
                    // Validate Clients
                    if (DatabasePersistenceService.ValidationSettings.ValidateHealthcareParticipants)
                    {
                        IHealthcareWorkerIdentityService ptcptLookup = ApplicationContext.CurrentContext.GetService(typeof(IHealthcareWorkerIdentityService)) as IHealthcareWorkerIdentityService;
                        if (ptcptLookup == null)
                        {
                            throw new InvalidOperationException("Unable to validate participant as no participant lookup service exists that can fulfill this request");
                        }
                        resPtcpt = ptcptLookup.FindParticipant(ptcpt.AlternateIdentifiers[0]);
                        if (resPtcpt == null || QueryUtil.MatchName(resPtcpt.LegalName, resPtcpt.LegalName) < DatabasePersistenceService.ValidationSettings.PersonNameMatch)
                        {
                            throw new DataException(String.Format("Could not validate participant {1}^^^&{0}&ISO against the participant validation service", ptcpt.AlternateIdentifiers[0].Domain, ptcpt.AlternateIdentifiers[0].Identifier));
                        }
                    }
                    CreatePtcpt(conn, tx, ptcpt);
                }
                else if (resPtcpt == null)
                {
                    throw new DataException(String.Format("Particiapant {1}^^^&{0}&ISO cannot be found in this system", ptcpt.AlternateIdentifiers[0].Domain, ptcpt.AlternateIdentifiers[0].Identifier));
                }
                else
                {
                    // Validate the name given matches the legal name. Has to be more than
                    // 80% match
                    if (QueryUtil.MatchName(ptcpt.LegalName, resPtcpt.LegalName) < DatabasePersistenceService.ValidationSettings.PersonNameMatch)
                    {
                        throw new DataException(String.Format("The provided legal name does not match the legal name of participant {1}^^^&{0}&ISO, please ensure participant name is correct", ptcpt.AlternateIdentifiers[0].Domain, ptcpt.AlternateIdentifiers[0].Identifier));
                    }

                    ptcpt.Id             = resPtcpt.Id;
                    ptcpt.LegalName      = resPtcpt.LegalName ?? ptcpt.LegalName;
                    ptcpt.PrimaryAddress = resPtcpt.PrimaryAddress ?? ptcpt.PrimaryAddress;
                    ptcpt.Type           = resPtcpt.Type ?? ptcpt.Type;

                    // TODO: Update the information about the provider

                    // Register alternative identifiers
                    foreach (var id in ptcpt.AlternateIdentifiers)
                    {
                        if (resPtcpt.AlternateIdentifiers.Count(o => o.Domain == id.Domain) == 0) // register
                        {
                            CreateAlternateIdentifier(conn, tx, ptcpt.Id, id);
                        }
                    }
                }
            }

            // Persist the site with the container if known
            if (ptcpt.Site != null && ptcpt.Site.Container is RegistrationEvent)
            {
                LinkHealthServiceRecord(conn, tx, (ptcpt.Site.Container as RegistrationEvent).Id, ptcpt.Site as HealthServiceRecordSite);
            }

            // Persist any components within the provider record
            DbUtil.PersistComponents(conn, tx, isUpdate, this, ptcpt);

            // Return the versioned identifier
            return(new VersionedDomainIdentifier()
            {
                Domain = configServce.OidRegistrar.GetOid(ClientRegistryOids.PROVIDER_CRID).Oid,
                Identifier = ptcpt.Id.ToString()
            });
        }
        /// <summary>
        /// Get provider by an identifier
        /// </summary>
        internal HealthcareParticipant GetProvider(System.Data.IDbConnection conn, System.Data.IDbTransaction tx, DomainIdentifier domainIdentifier)
        {
            // Get configuration service
            ISystemConfigurationService config = ApplicationContext.ConfigurationService; //ApplicationContext.Current.GetService(typeof(ISystemConfigurationService)) as ISystemConfigurationService;

            // Create database command
            IDbCommand cmd = DbUtil.CreateCommandStoredProc(conn, tx);

            try
            {
                // Fetch the client data using shrid
                if (String.IsNullOrEmpty(domainIdentifier.Domain) || domainIdentifier.Domain.Equals(config.OidRegistrar.GetOid(ClientRegistryOids.PROVIDER_CRID).Oid))
                {
                    cmd.CommandText = "get_hc_ptcpt";
                    cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_id_in", DbType.Decimal, Convert.ToDecimal(domainIdentifier.Identifier)));
                }
                else // get using alt id
                {
                    cmd.CommandText = "get_hc_ptcpt_extern";
                    cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_id_domain_in", DbType.StringFixedLength, domainIdentifier.Domain));
                    cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_id_in", DbType.StringFixedLength, (object)domainIdentifier.Identifier ?? DBNull.Value));
                }

                // Execute the reader
                IDataReader reader = cmd.ExecuteReader();

                // read data
                if (!reader.Read())
                {
                    return(null);
                }

                // Parse data
                HealthcareParticipant retVal = new HealthcareParticipant();
                decimal?nsSetId = null, addrSetId = null, typeCodeId = null;
                try
                {
                    retVal.Id         = Convert.ToDecimal(reader["ptcpt_id"]);
                    retVal.Classifier = Convert.ToString(reader["ptcpt_cls_cs"]).Trim().Equals("PSN") ? HealthcareParticipant.HealthcareParticipantType.Person : HealthcareParticipant.HealthcareParticipantType.Organization;
                    // Define set identifiers
                    nsSetId    = reader["ptcpt_name_set_id"] == DBNull.Value ? null : (decimal?)Convert.ToDecimal(reader["ptcpt_name_set_id"]);
                    addrSetId  = reader["ptcpt_addr_set_id"] == DBNull.Value ? null : (decimal?)Convert.ToDecimal(reader["ptcpt_addr_set_id"]);
                    typeCodeId = reader["ptcpt_typ_cd_id"] == DBNull.Value ? null : (decimal?)Convert.ToDecimal(reader["ptcpt_typ_cd_id"]);
                }
                finally
                {
                    // Close the reader
                    reader.Close();
                }

                // Get name set
                if (nsSetId.HasValue)
                {
                    retVal.LegalName = DbUtil.GetName(conn, tx, nsSetId, false);
                }
                // Get addr set
                if (addrSetId.HasValue)
                {
                    retVal.PrimaryAddress = DbUtil.GetAddress(conn, tx, addrSetId, false);
                }
                // Get type code
                if (typeCodeId.HasValue)
                {
                    retVal.Type = DbUtil.GetCodedValue(conn, tx, typeCodeId);
                }

                // Read alternate identifiers
                retVal.AlternateIdentifiers.AddRange(GetAlternateIdentifiers(conn, tx, retVal.Id));
                retVal.AlternateIdentifiers.Add(new DomainIdentifier()
                {
                    Domain     = config.OidRegistrar.GetOid(ClientRegistryOids.PROVIDER_CRID).Oid,
                    Identifier = retVal.Id.ToString()
                });

                // Read telecoms
                retVal.TelecomAddresses.AddRange(GetTelecomAddresses(conn, tx, retVal.Id));

                // Return type
                return(retVal);
            }
            finally
            {
                cmd.Dispose();
            }
        }
        /// <summary>
        /// Create a participant
        /// </summary>
        private void CreatePtcpt(System.Data.IDbConnection conn, System.Data.IDbTransaction tx, HealthcareParticipant ptcpt)
        {
            IDbCommand cmd = DbUtil.CreateCommandStoredProc(conn, tx);

            try
            {
                // Create name set
                decimal?nameSetId = null, addrSetId = null,
                       typeCodeId = null;

                // Create name
                if (ptcpt.LegalName != null)
                {
                    nameSetId = DbUtil.CreateNameSet(conn, tx, ptcpt.LegalName);
                }
                if (ptcpt.PrimaryAddress != null)
                {
                    addrSetId = DbUtil.CreateAddressSet(conn, tx, ptcpt.PrimaryAddress);
                }
                if (ptcpt.Type != null)
                {
                    typeCodeId = DbUtil.CreateCodedValue(conn, tx, ptcpt.Type);
                }

                // Does
                // Create person
                if (ptcpt.Classifier == HealthcareParticipant.HealthcareParticipantType.Person)
                {
                    cmd.CommandText = "crt_hc_ptcpt_psn";
                    cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_name_set_id_in", DbType.Decimal, (object)nameSetId ?? DBNull.Value));
                    cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_addr_set_id_in", DbType.Decimal, (object)addrSetId ?? DBNull.Value));
                    cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_tel_in", DbType.StringFixedLength, DBNull.Value));
                    cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_typ_cd_id_in", DbType.Decimal, (object)typeCodeId ?? DBNull.Value));
                }
                else
                {
                    cmd.CommandText = "crt_hc_ptcpt_org";
                    cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_name_in", DbType.StringFixedLength, ptcpt.LegalName != null && ptcpt.LegalName.Parts.Count > 0 ? (object)ptcpt.LegalName.Parts[0].Value : DBNull.Value));
                    cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_addr_set_id_in", DbType.Decimal, (object)addrSetId ?? DBNull.Value));
                    cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_work_tel_in", DbType.StringFixedLength, DBNull.Value));
                    cmd.Parameters.Add(DbUtil.CreateParameterIn(cmd, "ptcpt_typ_cd_id_in", DbType.Decimal, (object)typeCodeId ?? DBNull.Value));
                }

                // Execute a scalar
                ptcpt.Id = Convert.ToDecimal(cmd.ExecuteScalar());

                // Register an alternate identifier if they exist

                // normalize alt identifiers, remove duplicates
                for (int i = ptcpt.AlternateIdentifiers.Count - 1; i > 0; i--)
                {
                    if (ptcpt.AlternateIdentifiers.Count(o => o.Domain.Equals(ptcpt.AlternateIdentifiers[i].Domain) ||
                                                         o.Identifier.Equals(ptcpt.AlternateIdentifiers[i].Identifier)) > 1)
                    {
                        ptcpt.AlternateIdentifiers.RemoveAt(i);
                    }
                }

                foreach (var id in ptcpt.AlternateIdentifiers)
                {
                    CreateAlternateIdentifier(conn, tx, ptcpt.Id, id);
                }

                // Register all telecom addresses
                if (ptcpt.TelecomAddresses != null)
                {
                    foreach (var tel in ptcpt.TelecomAddresses)
                    {
                        CreateTelecommunicationsAddress(conn, tx, tel, ptcpt.Id);
                    }
                }
            }
            finally
            {
                cmd.Dispose();
            }
        }
Пример #16
0
        /// <summary>
        /// Create organization scoper
        /// </summary>
        private MARC.Everest.RMIM.UV.NE2008.COCT_MT150003UV03.Organization CreateOrganization(HealthcareParticipant scoper, List <MARC.Everest.Connectors.IResultDetail> details)
        {
            if (scoper == null)
            {
                return(null);
            }

            PN tName = null;

            if (scoper.LegalName != null)
            {
                tName = CreatePN(scoper.LegalName, details);
            }

            var id = scoper.AlternateIdentifiers.Find(o => o.Domain != this.m_configService.OidRegistrar.GetOid("CR_PID").Oid);

            // Basic return value
            var retVal = new MARC.Everest.RMIM.UV.NE2008.COCT_MT150003UV03.Organization(
                SET <II> .CreateSET(CreateII(id, details)),
                scoper.Type != null ? CreateCD <String>(scoper.Type, details) : null,
                tName != null ? BAG <ON> .CreateBAG(new ON(tName.Use[0], tName.Part)) : null,
                null
                );

            // Find all representatives
            foreach (HealthcareParticipant rep in scoper.FindAllComponents(HealthServiceRecordSiteRoleType.RepresentitiveOf))
            {
                var cp = new MARC.Everest.RMIM.UV.NE2008.COCT_MT150003UV03.ContactParty(
                    CreateIISet(rep.AlternateIdentifiers, details),
                    rep.Type != null ? CreateCD <String>(rep.Type, details) : null,
                    rep.PrimaryAddress != null ? BAG <AD> .CreateBAG(CreateAD(rep.PrimaryAddress, details)) : null,
                    null,
                    null
                    );

                // Add telecoms
                if (rep.TelecomAddresses != null)
                {
                    cp.Telecom = new BAG <TEL>();
                    foreach (var tel in rep.TelecomAddresses)
                    {
                        cp.Telecom.Add(CreateTEL(tel, details));
                    }
                }

                // Person info
                if (rep.Classifier == HealthcareParticipant.HealthcareParticipantType.Person && rep.LegalName != null)
                {
                    cp.ContactPerson = new MARC.Everest.RMIM.UV.NE2008.COCT_MT150003UV03.Person(
                        BAG <EN> .CreateBAG(CreatePN(rep.LegalName, details))
                        );
                }
                retVal.ContactParty.Add(cp);
            }

            return(retVal);
        }
Пример #17
0
        /// <summary>
        /// Create provider organization
        /// </summary>
        private Everest.RMIM.UV.NE2008.COCT_MT150003UV03.Organization CreateProviderOrganization(HealthcareParticipant providerOrg)
        {
            var contactParties = providerOrg.FindAllComponents(SVC.Core.ComponentModel.HealthServiceRecordSiteRoleType.RepresentitiveOf);

            // Construct
            var retVal = new Everest.RMIM.UV.NE2008.COCT_MT150003UV03.Organization(
                CreateIISet(providerOrg.AlternateIdentifiers),
                CreateCD <String>(providerOrg.Type),
                BAG <ON> .CreateBAG(CreateON(providerOrg.LegalName)),
                null
                );

            // Converts the contact party(ies)
            foreach (HealthcareParticipant cp in contactParties)
            {
                var contact = new Everest.RMIM.UV.NE2008.COCT_MT150003UV03.ContactParty(
                    CreateIISet(cp.AlternateIdentifiers),
                    CreateCD <String>(cp.Type),
                    BAG <AD> .CreateBAG(CreateAD(cp.PrimaryAddress)),
                    null,
                    null);

                // Add tel addresses to the contact parties
                if (cp.TelecomAddresses != null)
                {
                    contact.Telecom = new BAG <TEL>();
                    foreach (var tel in cp.TelecomAddresses)
                    {
                        contact.Telecom.Add(CreateTEL(tel));
                    }
                }

                // Person?
                if (cp.Classifier == HealthcareParticipant.HealthcareParticipantType.Person)
                {
                    contact.ContactPerson = new Everest.RMIM.UV.NE2008.COCT_MT150003UV03.Person(
                        BAG <EN> .CreateBAG(CreatePN(cp.LegalName))
                        );
                }

                retVal.ContactParty.Add(contact);
            }

            return(retVal);
        }