public PRPA_IN201306UV02 PRPA_IN201305UV02(string CURRENT_USER, Int32 CURRENT_REGISTRY_ID, PATIENT p)
        {
            PRPA_IN201306UV02 objReturn = null;

            try
            {
                PRPA_MT201306UV02ParameterList patientParameters = GetDemographicParameters(p);
                if (patientParameters == null)
                {
                    return(null);
                }
                QUQI_MT021001UV01DataEnterer[] currentUser = GetDataEnterer(CURRENT_USER, CURRENT_REGISTRY_ID);

                if (rsMain == null)
                {
                    InitProxy();
                }

                string createDateTime = DateTime.Now.ToString("yyyyMMddhhmmss");

                PRPA_IN201305UV02 PRPA_IN201305UV021 = new PRPA_IN201305UV02()
                {
                    id = new II()
                    {
                        root = vaRoot, extension = string.Format("{0}-{1}", "MCID", createDateTime)
                    },
                    creationTime = new TS()
                    {
                        value = createDateTime
                    },
                    versionCode = new CS()
                    {
                        code = verCode
                    },
                    interactionId = new II()
                    {
                        extension = "PRPA_IN201305UV02", root = iiRoot
                    },
                    processingCode = new CS()
                    {
                        code = prcCode
                    },
                    processingModeCode = new CS()
                    {
                        code = "T"
                    },
                    acceptAckCode = new CS()
                    {
                        code = "AL"
                    },

                    receiver = new MCCI_MT000100UV01Receiver[]
                    {
                        new MCCI_MT000100UV01Receiver()
                        {
                            typeCode = CommunicationFunctionType.RCV,
                            device   = new MCCI_MT000100UV01Device()
                            {
                                determinerCode = "INSTANCE",
                                classCode      = EntityClassDevice.DEV,
                                id             = new II[] { new II()
                                                            {
                                                                root = vaRoot
                                                            } }
                            }
                        }
                    },

                    sender = new MCCI_MT000100UV01Sender()
                    {
                        typeCode = CommunicationFunctionType.SND,
                        device   = new MCCI_MT000100UV01Device()
                        {
                            determinerCode = "INSTANCE",
                            classCode      = EntityClassDevice.DEV,
                            id             = new II[] { new II()
                                                        {
                                                            root = vaRoot, extension = "200CRSE"
                                                        } }
                        }
                    },

                    controlActProcess = new PRPA_IN201305UV02QUQI_MT021001UV01ControlActProcess()
                    {
                        dataEnterer = currentUser,
                        classCode   = ActClassControlAct.CACT,
                        moodCode    = x_ActMoodIntentEvent.EVN,
                        code        = new CD()
                        {
                            code = "PRPA_TE201305UV02", codeSystem = iiRoot
                        },

                        queryByParameter = new PRPA_MT201306UV02QueryByParameter()
                        {
                            queryId = new II()
                            {
                                root = vaRoot, extension = createDateTime
                            },
                            statusCode = new CS()
                            {
                                code = "new"
                            },
                            modifyCode = new CS()
                            {
                                code = "MVI.COMP1"
                            },
                            initialQuantity = new INT()
                            {
                                value = "1"
                            },
                            parameterList = patientParameters
                        },
                    }
                };

                ////Used for debugging request
                //SoapEnvelope envelope = new SoapEnvelope();
                //envelope.body = new Body();
                //envelope.body.PRPA_IN201305UV02 = PRPA_IN201305UV021;

                //XmlSerializer ser = new XmlSerializer(typeof(SoapEnvelope));
                //TextWriter writer = new StreamWriter("C:\\temp\\PRPA_IN201305UV02.xml");
                //ser.Serialize(writer, envelope);
                //writer.Close();

                LogDetails logDetails = new LogDetails(String.Format("{0}.{1}", System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName, System.Reflection.MethodBase.GetCurrentMethod().Name), CURRENT_USER, CURRENT_REGISTRY_ID);
                objReturn = rsMain.PRPA_IN201305UV02(PRPA_IN201305UV021);
                LogManager.LogTiming(logDetails);

                ////Used for debugging response
                //if (objReturn != null)
                //{
                //    envelope = new SoapEnvelope();
                //    envelope.body = new Body();
                //    envelope.body.PRPA_IN201306UV02 = objReturn;

                //    ser = new XmlSerializer(typeof(SoapEnvelope));
                //    writer = new StreamWriter("C:\\temp\\PRPA_IN201306UV02.xml");
                //    ser.Serialize(writer, envelope);
                //    writer.Close();
                //}
            }
            catch (WebException ex)
            {
                LogManager.LogError(ex.Message, String.Format("{0}.{1}", System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName, System.Reflection.MethodBase.GetCurrentMethod().Name), CURRENT_USER, CURRENT_REGISTRY_ID);
                throw ex;
            }
            catch (Exception ex)
            {
                LogManager.LogError(ex.Message, String.Format("{0}.{1}", System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName, System.Reflection.MethodBase.GetCurrentMethod().Name), CURRENT_USER, CURRENT_REGISTRY_ID);
                throw ex;
            }

            return(objReturn);
        }
        public static bool PRPA_IN201305UV02(string CURRENT_USER, Int32 CURRENT_REGISTRY_ID, Int32 CURRENT_PATIENT_ID)
        {
            bool  objReturn = false;
            MviDB objDB     = new MviDB();

            PATIENT p = PATIENTManager.GetItemComplete(CURRENT_USER, CURRENT_REGISTRY_ID, CURRENT_PATIENT_ID);

            if (p != null)
            {
                if (p.SPATIENT == null)
                {
                    p.SPATIENT = new SPATIENT()
                    {
                        PatientICN = p.PatientICN
                    };
                }
                PRPA_IN201306UV02 prpaItem = objDB.PRPA_IN201305UV02(CURRENT_USER, CURRENT_REGISTRY_ID, p);
                if (prpaItem != null)
                {
                    if (prpaItem.controlActProcess != null && prpaItem.controlActProcess.queryAck != null && prpaItem.controlActProcess.queryAck.queryResponseCode != null && !string.IsNullOrEmpty(prpaItem.controlActProcess.queryAck.queryResponseCode.code))
                    {
                        switch (prpaItem.controlActProcess.queryAck.queryResponseCode.code.Trim().ToUpper())
                        {
                        case "OK":
                            int resultCurrentQuantity = 0;
                            int.TryParse(prpaItem.controlActProcess.queryAck.resultCurrentQuantity.value, out resultCurrentQuantity);
                            if (resultCurrentQuantity == 1)     //TODO: may need to handle multiple results at some point???...display list to user or something
                            {
                                if (prpaItem.controlActProcess.subject != null &&
                                    prpaItem.controlActProcess.subject[0].registrationEvent != null &&
                                    prpaItem.controlActProcess.subject[0].registrationEvent.subject1 != null &&
                                    prpaItem.controlActProcess.subject[0].registrationEvent.subject1.patient != null)
                                {
                                    //TODO: ID's
                                    if (prpaItem.controlActProcess.subject[0].registrationEvent.subject1.patient.Item != null)
                                    {
                                        if (prpaItem.controlActProcess.subject[0].registrationEvent.subject1.patient.Item is PRPA_MT201310UV02Person)
                                        {
                                            PRPA_MT201310UV02Person person = (PRPA_MT201310UV02Person)prpaItem.controlActProcess.subject[0].registrationEvent.subject1.patient.Item;

                                            //NAMES (First and Last)
                                            if (person.name != null && person.name.Length > 0 && person.name[0].Items != null && person.name[0].Items.Length > 0)
                                            {
                                                int givenCount = 0;

                                                for (int i = 0; i < person.name[0].Items.Length; i++)
                                                {
                                                    if (person.name[0].ItemsElementName.Length > i)
                                                    {
                                                        switch (person.name[0].ItemsElementName[i])
                                                        {
                                                        case ItemsChoiceType8.given:
                                                            if (givenCount == 0)
                                                            {
                                                                p.FIRST_NAME = p.SPATIENT.PatientFirstName = person.name[0].Items[i];
                                                            }
                                                            else if (givenCount > 0)
                                                            {
                                                                p.MIDDLE_NAME = person.name[0].Items[i];
                                                            }

                                                            givenCount++;
                                                            break;

                                                        case ItemsChoiceType8.family:
                                                            p.LAST_NAME = p.SPATIENT.PatientLastName = person.name[0].Items[i];
                                                            break;

                                                        default:
                                                            break;
                                                        }
                                                    }
                                                }
                                            }

                                            //PHONES
                                            if (person.telecom != null && person.telecom.Length > 0)
                                            {
                                                foreach (TEL tel in person.telecom)
                                                {
                                                    if (!string.IsNullOrEmpty(tel.value) && tel.use != null && tel.use.Length > 0)
                                                    {
                                                        switch (tel.use[0])
                                                        {
                                                        case "HP":
                                                            p.SPATIENT.PhoneResidence = RemoveChars(tel.value);
                                                            break;

                                                        default:
                                                            break;
                                                        }
                                                    }
                                                }
                                            }

                                            //GENDER
                                            if (person.administrativeGenderCode != null && !string.IsNullOrEmpty(person.administrativeGenderCode.code))
                                            {
                                                p.SPATIENT.Gender = person.administrativeGenderCode.code.Trim().ToUpper().Substring(0, 1);
                                            }

                                            //DOB
                                            if (person.birthTime != null && !string.IsNullOrEmpty(person.birthTime.value))
                                            {
                                                int y = 0;
                                                int m = 0;
                                                int d = 0;

                                                if (person.birthTime.value.Length >= 4)
                                                {
                                                    int.TryParse(person.birthTime.value.Substring(0, 4), out y);
                                                }

                                                if (person.birthTime.value.Length >= 6)
                                                {
                                                    int.TryParse(person.birthTime.value.Substring(4, 2), out m);
                                                }

                                                if (person.birthTime.value.Length >= 8)
                                                {
                                                    int.TryParse(person.birthTime.value.Substring(6, 2), out d);
                                                }

                                                DateTime?dob = null;

                                                if (p.SPATIENT.DateOfBirth != null)
                                                {
                                                    dob = p.SPATIENT.DateOfBirth;
                                                }
                                                else if (p.BIRTH_DATE != null)
                                                {
                                                    dob = p.BIRTH_DATE;
                                                }

                                                if (y == 0 && dob != null)
                                                {
                                                    y = dob.Value.Year;
                                                }
                                                if (m == 0 && dob != null)
                                                {
                                                    m = dob.Value.Month;
                                                }
                                                if (d == 0 && dob != null)
                                                {
                                                    d = dob.Value.Day;
                                                }

                                                if (y > 0 && m > 0 && d > 0 && dob != null)
                                                {
                                                    p.BIRTH_DATE = p.SPATIENT.DateOfBirth = new DateTime(y, m, d, dob.Value.Hour, dob.Value.Minute, dob.Value.Second);
                                                }
                                                else if (y > 0 && m > 0 && d > 0)
                                                {
                                                    p.BIRTH_DATE = p.SPATIENT.DateOfBirth = new DateTime(y, m, d);
                                                }
                                            }

                                            //ADDRESSES
                                            if (person.addr != null && person.addr.Length > 0)
                                            {
                                                foreach (AD a in person.addr)
                                                {
                                                    if (a.use != null && a.use.Length > 0)
                                                    {
                                                        if (a.use[0] == "PHYS")     //TODO: CRSe DB only stores one address, should we check for other MVI address types here???
                                                        {
                                                            if (a.Items != null && a.Items.Length > 0)
                                                            {
                                                                for (int i = 0; i < a.Items.Length; i++)
                                                                {
                                                                    switch (a.ItemsElementName[i])
                                                                    {
                                                                    case ItemsChoiceType7.streetAddressLine:
                                                                        p.SPATIENT.StreetAddress1 = a.Items[i].ToString();
                                                                        break;

                                                                    case ItemsChoiceType7.city:
                                                                        p.SPATIENT.City = a.Items[i].ToString();
                                                                        break;

                                                                    case ItemsChoiceType7.state:
                                                                        p.SPATIENT.State = a.Items[i].ToString();
                                                                        break;

                                                                    case ItemsChoiceType7.postalCode:
                                                                        p.SPATIENT.PostalCode = a.Items[i].ToString();
                                                                        break;

                                                                    case ItemsChoiceType7.country:
                                                                        p.SPATIENT.Country = a.Items[i].ToString();
                                                                        break;

                                                                    default:
                                                                        break;
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }

                                            //OTHER IDS (SSN)
                                            if (person.asOtherIDs != null && person.asOtherIDs.Length > 0)
                                            {
                                                foreach (PRPA_MT201310UV02OtherIDs id in person.asOtherIDs)
                                                {
                                                    if (id.id != null && id.id.Length > 0)
                                                    {
                                                        if (id.classCode == "SSN")
                                                        {
                                                            p.SPATIENT.PatientSSN = id.id[0].extension;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }

                                p.PATIENT_ID = PATIENTManager.SaveComplete(CURRENT_USER, CURRENT_REGISTRY_ID, p);

                                objReturn = true;
                            }
                            break;

                        case "NF":
                            break;

                        default:
                            break;
                        }
                    }
                }
            }

            objDB.Dispose();

            return(objReturn);
        }
Пример #3
0
        /// <summary>
        /// Handle a query for patient demographic data
        /// </summary>
        private IGraphable HandleQueryPatientDemographics(MARC.Everest.Connectors.UnsolicitedDataEventArgs e, MARC.Everest.Connectors.IReceiveResult receivedMessage)
        {
            // Setup the lists of details and issues
            List <IResultDetail> dtls = new List <IResultDetail>(receivedMessage.Details);

            // System configuration service
            ISystemConfigurationService configService = Context.GetService(typeof(ISystemConfigurationService)) as ISystemConfigurationService;

            // Localization service
            ILocalizationService locale = Context.GetService(typeof(ILocalizationService)) as ILocalizationService;

            // Data Service
            IClientRegistryDataService dataSvc = Context.GetService(typeof(IClientRegistryDataService)) as IClientRegistryDataService;

            // Do basic check and add common validation errors
            MessageUtil.ValidateTransportWrapperUv(receivedMessage.Structure as IInteraction, configService, dtls);

            // Check the request is valid
            var request = receivedMessage.Structure as PRPA_IN201305UV02;

            if (request == null)
            {
                return(null);
            }

            // Determine if the received message was interpreted properly
            bool isValid = MessageUtil.IsValid(receivedMessage);

            // set the URI
            if (request.controlActProcess != null)
            {
                request.controlActProcess.Code = request.controlActProcess.Code ?? Util.Convert <CD <String> >(PRPA_IN201302UV02.GetTriggerEvent());
            }
            if (request.Receiver.Count > 0)
            {
                request.Receiver[0].Telecom = request.Receiver[0].Telecom ?? e.ReceiveEndpoint.ToString();
            }


            // Construct the acknowledgment
            var response = new PRPA_IN201306UV02(
                new II(configService.OidRegistrar.GetOid("CR_MSGID").Oid, Guid.NewGuid().ToString()),
                DateTime.Now,
                PRPA_IN201306UV02.GetInteractionId(),
                request.ProcessingCode,
                request.ProcessingModeCode,
                AcknowledgementCondition.Never,
                MessageUtil.CreateReceiver(request.Sender),
                MessageUtil.CreateSenderUv(e.ReceiveEndpoint, configService),
                null
                );


            // Create the support classes
            AuditData audit = null;

            IheAuditUtil dataUtil = new IheAuditUtil()
            {
                Context = this.Context
            };

            // Try to execute the record
            try
            {
                // Determine if the message is valid
                if (!isValid)
                {
                    throw new MessageValidationException(locale.GetString("MSGE00A"), receivedMessage.Structure);
                }

                // Construct the canonical data structure
                PatientDemographicsQueryResponseFactory fact = new PatientDemographicsQueryResponseFactory()
                {
                    Context = this.Context
                };
                RegistryQueryRequest filter = fact.CreateFilterData(request, dtls);

                if (filter.QueryRequest == null)
                {
                    throw new MessageValidationException(locale.GetString("MSGE00A"), receivedMessage.Structure);
                }

                // Query
                var results = dataSvc.Query(filter);

                dtls.AddRange(results.Details);

                // Prepare for audit
                audit = dataUtil.CreateAuditData("ITI-47",
                                                 ActionType.Execute,
                                                 dtls.Exists(r => r.Type == ResultDetailType.Error) ? OutcomeIndicator.MinorFail : OutcomeIndicator.Success,
                                                 e,
                                                 receivedMessage,
                                                 results,
                                                 filter.QueryRequest.FindComponent(SVC.Core.ComponentModel.HealthServiceRecordSiteRoleType.AuthorOf) as HealthcareParticipant
                                                 );


                response = fact.Create(request, results, dtls) as PRPA_IN201306UV02;
            }
            catch (Exception ex)
            {
                Trace.TraceError(ex.ToString());

                // Prepare for audit
                audit = dataUtil.CreateAuditData("ITI-47", ActionType.Execute, OutcomeIndicator.EpicFail, e, receivedMessage,
                                                 new List <VersionedDomainIdentifier>(),
                                                 null
                                                 );

                dtls.Add(new ResultDetail(ResultDetailType.Error, ex.Message, ex));
                response.Acknowledgement.Add(new MARC.Everest.RMIM.UV.NE2008.MCCI_MT100300UV01.Acknowledgement(
                                                 AcknowledgementType.AcceptAcknowledgementCommitError,
                                                 new MARC.Everest.RMIM.UV.NE2008.MCCI_MT100200UV01.TargetMessage(request.Id)
                                                 ));
                // Add AE for query response
                response.controlActProcess = new MARC.Everest.RMIM.UV.NE2008.MFMI_MT700711UV01.ControlActProcess <MARC.Everest.RMIM.UV.NE2008.PRPA_MT201306UV02.QueryByParameter, MARC.Everest.RMIM.UV.NE2008.PRPA_MT201310UV02.Patient, object>(
                    "EVN",
                    new MARC.Everest.RMIM.UV.NE2008.QUQI_MT120001UV01.QueryAck(
                        QueryResponse.ApplicationError
                        )
                    );
            }
            finally
            {
                IAuditorService auditService = Context.GetService(typeof(IAuditorService)) as IAuditorService;
                if (auditService != null)
                {
                    auditService.SendAudit(audit);
                }
            }

            // Common response parameters
            response.ProfileId     = new SET <II>(MCCI_IN000002UV01.GetProfileId());
            response.VersionCode   = HL7StandardVersionCode.Version3_Prerelease1;
            response.AcceptAckCode = AcknowledgementCondition.Never;
            response.Acknowledgement[0].AcknowledgementDetail.AddRange(MessageUtil.CreateAckDetailsUv(dtls.ToArray()));
            return(response);
        }
        /// <summary>
        /// Create the interaction type
        /// </summary>
        public MARC.Everest.Interfaces.IInteraction Create(MARC.Everest.Interfaces.IInteraction request, RegistryQueryResult results, List <IResultDetail> dtls)
        {
            // GEt the config services
            ISystemConfigurationService configService = Context.GetService(typeof(ISystemConfigurationService)) as ISystemConfigurationService;

            var retHl7v3 = new List <MARC.Everest.RMIM.UV.NE2008.MFMI_MT700711UV01.Subject1 <MARC.Everest.RMIM.UV.NE2008.PRPA_MT201310UV02.Patient, object> >();
            //List<MARC.Everest.RMIM.CA.R020403.MFMI_MT700746CA.Subject2<MARC.Everest.RMIM.CA.R020403.PRPA_MT101104CA.IdentifiedEntity>> retHl7v3 = new List<MARC.Everest.RMIM.CA.R020403.MFMI_MT700746CA.Subject2<MARC.Everest.RMIM.CA.R020403.PRPA_MT101104CA.IdentifiedEntity>>(results.Results.Count());
            UvDeComponentUtil dCompUtil = new UvDeComponentUtil();

            dCompUtil.Context = this.Context;

            PRPA_IN201305UV02 rqst = request as PRPA_IN201305UV02;

            // Convert results to HL7v3
            foreach (RegistrationEvent res in results.Results)
            {
                var retRec = new MARC.Everest.RMIM.UV.NE2008.MFMI_MT700711UV01.Subject1 <MARC.Everest.RMIM.UV.NE2008.PRPA_MT201310UV02.Patient, object>(
                    true,
                    dCompUtil.CreateRegistrationEvent(res, dtls)
                    );
                if (retRec.RegistrationEvent == null)
                {
                    retRec = new MARC.Everest.RMIM.UV.NE2008.MFMI_MT700711UV01.Subject1 <MARC.Everest.RMIM.UV.NE2008.PRPA_MT201310UV02.Patient, object>(
                        false,
                        new MARC.Everest.RMIM.UV.NE2008.MFMI_MT700711UV01.RegistrationEvent <MARC.Everest.RMIM.UV.NE2008.PRPA_MT201310UV02.Patient, object>()
                    {
                        NullFlavor = NullFlavor.NoInformation
                    }
                        );
                }
                retHl7v3.Add(retRec);
            }

            // HACK: Sort by confidence score (if present)
            //retHl7v3.Sort((a, b) =>
            //    a != null && b != null &&
            //    a.RegistrationEvent != null && b.RegistrationEvent != null &&
            //    a.RegistrationEvent.Subject1 != null && b.RegistrationEvent.Subject1 != null &&
            //    a.RegistrationEvent.Subject1.registeredRole != null && b.RegistrationEvent.Subject1.registeredRole != null &&
            //    (a.RegistrationEvent.Subject1.registeredRole.SubjectOf1.Count > 0) && (b.RegistrationEvent.Subject1.registeredRole.SubjectOf1.Count > 0) ?
            //    (b.RegistrationEvent.Subject1.registeredRole.SubjectOf1[0].QueryMatchObservation.Value as INT).CompareTo((a.RegistrationEvent.Subject1.registeredRole.SubjectOf1[0].QueryMatchObservation.Value as INT)) : 0);

            // Create the response
            PRPA_IN201306UV02 response = new PRPA_IN201306UV02
                                         (
                Guid.NewGuid(),
                DateTime.Now,
                PRPA_IN201306UV02.GetInteractionId(),
                ProcessingID.Production,
                "T",
                AcknowledgementCondition.Never,
                MessageUtil.CreateReceiver(rqst.Sender),
                MessageUtil.CreateSenderUv(new Uri(rqst.Receiver[0].Telecom.Value), configService),
                null
                                         )
            {
                Acknowledgement = new List <MARC.Everest.RMIM.UV.NE2008.MCCI_MT100300UV01.Acknowledgement>()
                {
                    new MARC.Everest.RMIM.UV.NE2008.MCCI_MT100300UV01.Acknowledgement(
                        dtls.Count(a => a.Type == ResultDetailType.Error) == 0 ? AcknowledgementType.ApplicationAcknowledgementAccept : AcknowledgementType.ApplicationAcknowledgementError,
                        new MARC.Everest.RMIM.UV.NE2008.MCCI_MT100200UV01.TargetMessage(request.Id)
                        )
                }
            };

            response.controlActProcess = new MARC.Everest.RMIM.UV.NE2008.MFMI_MT700711UV01.ControlActProcess <MARC.Everest.RMIM.UV.NE2008.PRPA_MT201306UV02.QueryByParameter, MARC.Everest.RMIM.UV.NE2008.PRPA_MT201310UV02.Patient, object>("EVN")
            {
                Id       = SET <II> .CreateSET(new II(configService.Custodianship.Id.Domain, Guid.NewGuid().ToString())),
                Code     = new CD <string>(PRPA_IN201306UV02.GetTriggerEvent().Code, PRPA_IN201306UV02.GetTriggerEvent().CodeSystem),
                QueryAck = new MARC.Everest.RMIM.UV.NE2008.QUQI_MT120001UV01.QueryAck(
                    rqst.controlActProcess.queryByParameter.QueryId,
                    "complete",
                    (AcknowledgementType)response.Acknowledgement[0].TypeCode == AcknowledgementType.ApplicationAcknowledgementError ? QueryResponse.ApplicationError : results.TotalResults == 0 ? QueryResponse.NoDataFound : QueryResponse.DataFound,
                    results.TotalResults,
                    results.Results.Count,
                    results.TotalResults - results.Results.Count - results.StartRecordNumber
                    ),
                queryByParameter = rqst.controlActProcess.queryByParameter
            };

            response.controlActProcess.LanguageCode = MessageUtil.GetDefaultLanguageCode(this.Context);

            if (retHl7v3.Count > 0)
            {
                response.controlActProcess.Subject.AddRange(retHl7v3);
            }
            return(response);
        }
Пример #5
0
        /// <summary>
        /// Generate the auto complete data
        /// </summary>
        public String[] Filter(WcfClientConnector connector, string filter)
        {
            List <String> retVal = new List <String>();

            // Create the instance
            PRPA_IN201305UV02 instance = new PRPA_IN201305UV02(
                Guid.NewGuid(),
                DateTime.Now,
                PRPA_IN201305UV02.GetInteractionId(),
                ProcessingID.Production,
                "T",
                AcknowledgementCondition.Always,
                new MARC.Everest.RMIM.UV.NE2008.MCCI_MT100200UV01.Receiver()
            {
                Telecom = new TEL("http://cr.marc-hi.ca:8080/pdqsupplier"),
                Device  = new MARC.Everest.RMIM.UV.NE2008.MCCI_MT100200UV01.Device(
                    SET <II> .CreateSET(new II("1.3.6.1.4.1.33349.3.1.1.20.4", "CR"))
                    )
            },
                new MARC.Everest.RMIM.UV.NE2008.MCCI_MT100200UV01.Sender()
            {
                Telecom = new TEL()
                {
                    NullFlavor = NullFlavor.NoInformation
                },
                Device = new MARC.Everest.RMIM.UV.NE2008.MCCI_MT100200UV01.Device(
                    SET <II> .CreateSET(new II("1.2.3.4.5.4", "Sample"))
                    )
            },
                new MARC.Everest.RMIM.UV.NE2008.QUQI_MT021001UV01.ControlActProcess <MARC.Everest.RMIM.UV.NE2008.PRPA_MT201306UV02.QueryByParameter>("EVN")
            {
                Id   = SET <II> .CreateSET(Guid.NewGuid()),
                Code = CD <String> .Parse(PRPA_IN201305UV02.GetTriggerEvent()),
                AuthorOrPerformer = new List <MARC.Everest.RMIM.UV.NE2008.MFMI_MT700701UV01.AuthorOrPerformer>(),
                queryByParameter  = new MARC.Everest.RMIM.UV.NE2008.PRPA_MT201306UV02.QueryByParameter(
                    Guid.NewGuid(),
                    "new",
                    new MARC.Everest.RMIM.UV.NE2008.PRPA_MT201306UV02.ParameterList()

                    )
                {
                    InitialQuantity = 10
                }
            }
                );

            instance.controlActProcess.EffectiveTime = new IVL <TS>(DateTime.Now);

            // Set the author
            instance.controlActProcess.AuthorOrPerformer.Add(new MARC.Everest.RMIM.UV.NE2008.MFMI_MT700701UV01.AuthorOrPerformer());
            instance.controlActProcess.AuthorOrPerformer[0].SetParticipationChoice(new MARC.Everest.RMIM.UV.NE2008.COCT_MT090300UV01.AssignedDevice(
                                                                                       SET <II> .CreateSET(new II("1.2.3.4.5.4", "Sample")),
                                                                                       "DEV"
                                                                                       )
                                                                                   );

            // Set the filter for given then family
            foreach (var enpt in new EntityNamePartType[] { EntityNamePartType.Given, EntityNamePartType.Family })
            {
                instance.Id = Guid.NewGuid();
                instance.controlActProcess.queryByParameter.QueryId = Guid.NewGuid();

                // Set the name
                instance.controlActProcess.queryByParameter.ParameterList.LivingSubjectName.Clear();
                instance.controlActProcess.queryByParameter.ParameterList.LivingSubjectName.Add(
                    new MARC.Everest.RMIM.UV.NE2008.PRPA_MT201306UV02.LivingSubjectName(
                        SET <EN> .CreateSET(new EN(EntityNameUse.Search, new ENXP[] {
                    new ENXP(filter, enpt)
                })),
                        "livingSubject.name"
                        )
                    );

                // Make the query
                PRPA_IN201306UV02 response = this.SendReceive(connector, instance) as PRPA_IN201306UV02;

                // Interpret the response code
                if (response.Acknowledgement[0].TypeCode != AcknowledgementType.ApplicationAcknowledgementAccept ||
                    response.controlActProcess == null)
                {
                    continue;
                }
                foreach (var subj in response.controlActProcess.Subject)
                {
                    // Ensure that the relationships exist
                    if (subj.RegistrationEvent == null ||
                        subj.RegistrationEvent.Subject1 == null ||
                        subj.RegistrationEvent.Subject1.registeredRole == null ||
                        subj.RegistrationEvent.Subject1.registeredRole.GetPatientEntityChoiceSubjectAsPRPA_MT201310UV02Person() == null ||
                        subj.RegistrationEvent.Subject1.registeredRole.GetPatientEntityChoiceSubjectAsPRPA_MT201310UV02Person().Name == null ||
                        subj.RegistrationEvent.Subject1.registeredRole.GetPatientEntityChoiceSubjectAsPRPA_MT201310UV02Person().Name.IsEmpty)
                    {
                        continue;
                    }

                    // Add the formatted name
                    var legalName = subj.RegistrationEvent.Subject1.registeredRole.GetPatientEntityChoiceSubjectAsPRPA_MT201310UV02Person().Name.Find(o => o.Use != null && o.Use.Contains(EntityNameUse.Legal));
                    if (legalName == null)
                    {
                        legalName = subj.RegistrationEvent.Subject1.registeredRole.GetPatientEntityChoiceSubjectAsPRPA_MT201310UV02Person().Name[0];
                    }
                    retVal.Add(String.Format("{0}@{1} - {2}",
                                             subj.RegistrationEvent.Subject1.registeredRole.Id[0].Root,
                                             subj.RegistrationEvent.Subject1.registeredRole.Id[0].Extension,
                                             legalName.ToString("{FAM}, {GIV}")));
                }
            }

            // Now return results
            return(retVal.ToArray());
        }