Beispiel #1
0
        /// <summary>
        /// Handles the Click event of the btnParse control.
        /// Retreives the HL7 from the text box and attempts to parse it using NHapi.
        /// If successfull, it retreives all of the fields and displays them in the TreeListView
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        private void btnParse_Click(object sender, EventArgs e)
        {
            try
            {
                string hl7 = this.tbMessage.Text;

                PipeParser parser = new PipeParser();
                IMessage hl7Message;
                if (!string.IsNullOrEmpty(this.tbVersion.Text))
                {
                    hl7Message = parser.Parse(hl7, this.tbVersion.Text);
                }
                else
                {
                    hl7Message = parser.Parse(hl7);
                }

                if (hl7Message != null)
                {
                    this.lblMessageType.Text = hl7Message.GetStructureName();
                    this.lblMessageVersion.Text = hl7Message.Version;

                    FieldGroup messageGroup = new FieldGroup() { Name = hl7Message.GetStructureName() };
                    this.ProcessStructureGroup((AbstractGroup)hl7Message, messageGroup);

                    this.treeListView1.Objects = messageGroup.FieldList;
                    this.treeListView1.ExpandAll();
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }
        }
        public void TestADTA04IsMappedAsA01()
        {
            var hl7Data =
                "MSH|^~\\&|CohieCentral|COHIE|Clinical Data Provider|TCH|20060228155525||ADT^A04|1|P|2.6|\r"
                + "EVN|\r"
                + "PID|1|12345\r"
                + "PV1|1";

            var parser = new PipeParser();
            var msg    = parser.Parse(hl7Data);

            Assert.IsNotNull(msg, "Message should not be null");
            var a04 = (ADT_A01)msg;

            Assert.AreEqual("A04", a04.MSH.MessageType.TriggerEvent.Value);
            Assert.AreEqual("1", a04.PID.SetIDPID.Value);
        }
        public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type expectedObservationValueType)
        {
            var message =
                "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.6|||AL|||ASCII\r"
                + "PID|1||1711114||Appt^Test||19720501||||||||||||001020006\r"
                + "ORC|||||F\r"
                + "OBR|1|||ehipack^eHippa Acknowlegment|||200610120839|||||||||00002^eProvider^Electronic|||||||||F\r"
                + $"OBX|1|{expectedObservationValueType.Name}|||{expectedObservationValueType.Name}Value||||||F";

            var parser = new PipeParser();

            var parsed = (ORU_R01)parser.Parse(message);

            var actualObservationValueType = parsed.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.GetObservationValue(0).Data;

            Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType);
        }
Beispiel #4
0
        public void CanParseCustomSegments()
        {
            Output.WriteLine("\n==============================================\nTesting parsing to GenericMessageWrapper with message which contains custom Z segment ZRT\n");

            // Arrange
            var messageString = "MSH|^~\\&|ABC|DEF|DAL|QUEST|20160907113230||ORM^O01^ORM_O01|201609071132304107|P|2.5.1\rPID|1||[PATIENTID]^^^^MR||[LASTNAME]^[FIRSTNAME]^M^^^^L|SMITH|[DOB]|[GENDER]||2106-3^White^HL70005|123 Main St.^^Fischer^TX^78623^USA^H||^PRN^PH^[email protected]^^704^5551212~^^CP^^^980^5551414|^PRN^PH^^^704^5551313|eng^English^ISO639|S^Single|||123-45-6789|||N^Not Hispanic or Latino^HL70189\rPV1|1|O|^^^ZZZZZ00002^^C^^^Bleeding Edge Trauma Center||||NPIDA^Allthework^Dew^^^Mr^PA^^^^^^NPI^^^^^^^^PA||||||||||||ZZZZZ000EJ^^^^VN|||||||||||||||||||||||||20110511132339-0400\rORC|SN|[PON]||||||||||^Jekyll^Burt^^^^^^NPI^L\rOBR||[PON]||87590^Neisseria gonorrhoeae detection by nucleic acid, direct probe^C4|||201609071108|||||||| ^^^ |^Jekyll^Burt^^^^^^NPI^L||||||||LAB\rDG1|1||I25700^Atherosclerosis of CABG, unsp, w unstable angina pectoris^ICD\rZRT|1|Inbound Processor - Prod|ConfigID=1406;MessageID=16971290;MessageType=ORM;LabOrderID=32271;PatientID=1234;|SPLINTER|";
            var expectedZrt   = new []
            {
                "1",
                "Inbound Processor - Prod",
                "ConfigID=1406;MessageID=16971290;MessageType=ORM;LabOrderID=32271;PatientID=1234;",
                "SPLINTER"
            };

            var classFactory = new EnhancedModelClassFactory();
            var parser       = new PipeParser(classFactory);

            classFactory.ValidationContext = parser.ValidationContext;

            var message        = parser.Parse(messageString);
            var messageWrapper = message as GenericMessageWrapper;

            Assert.NotNull(messageWrapper);

            var originalMessage = messageWrapper.Unwrap();

            XMLParser xmlParser         = new DefaultXMLParser();
            var       xmlMessageStrict  = xmlParser.Encode(originalMessage);
            var       xmlMessageGeneric = xmlParser.Encode(message);

            Assert.Matches(@"^\<ORM_O01.*\<\/ORM_O01\>$", xmlMessageStrict);
            Assert.Matches(@"^\<GenericMessageWrapper.*\<\/GenericMessageWrapper\>$", xmlMessageGeneric);

            var zrt = messageWrapper.GetSegment <ISegment>("ZRT");

            var fieldCount = zrt.NumFields();

            for (var i = 1; i <= fieldCount; i++)
            {
                var field = zrt.GetField(i, 0);
                var value = ((Varies)field).Data;
                Assert.Equal(expectedZrt[i - 1], value.ToString());
                Output.WriteLine("{0}", value);
            }
        }
Beispiel #5
0
        public static void Main(string[] args)
        {
            const string messageString = "MSH|^~\\&|SENDING_APPLICATION|SENDING_FACILITY|RECEIVING_APPLICATION|RECEIVING_FACILITY|20110614075841||ACK|1407511|P|2.3||||||\r\n" +
                                         "MSA|AA|1407511|Success||";

            // instantiate a PipeParser, which handles the "traditional or default encoding"
            var ourPipeParser = new PipeParser();

            try
            {
                // parse the string format message into a Java message object
                var hl7Message = ourPipeParser.Parse(messageString);

                //cast to ACK message to get access to ACK message data
                var ackResponseMessage = hl7Message as ACK;
                if (ackResponseMessage != null)
                {
                    //access message data and display it
                    //note that I am using encode method at the end to convert it back to string for display
                    var mshSegmentMessageData = ackResponseMessage.MSH;
                    LogToDebugConsole("Message Type is " + mshSegmentMessageData.MessageType.MessageType);
                    LogToDebugConsole("Message Control Id is " + mshSegmentMessageData.MessageControlID);
                    LogToDebugConsole("Message Timestamp is " + mshSegmentMessageData.DateTimeOfMessage.TimeOfAnEvent.GetAsDate());
                    LogToDebugConsole("Sending Facility is " + mshSegmentMessageData.SendingFacility.NamespaceID.Value);

                    //update message data in MSA segment
                    ackResponseMessage.MSA.AcknowledgementCode.Value = "AR";
                }

                // Display the updated HL7 message using Pipe delimited format
                LogToDebugConsole("HL7 Pipe Delimited Message Output:");
                LogToDebugConsole(ourPipeParser.Encode(hl7Message));

                // instantiate an XML parser that NHAPI provides
                var ourXmlParser = new DefaultXMLParser();

                // convert from default encoded message into XML format, and send it to standard out for display
                LogToDebugConsole("HL7 XML Formatted Message Output:");
                LogToDebugConsole(ourXmlParser.Encode(hl7Message));
            }
            catch (Exception e)
            {
                LogToDebugConsole($"Error occured -> {e.StackTrace}");
            }
        }
Beispiel #6
0
        static void Main(string[] args)
        {
            try
            {
                // see my GitHub page for this file
                var messageString = ReadHl7MessageFromFileAsString(
                    "C:\\HL7TestInputFiles\\FileWithObservationResultMessage.txt");

                // instantiate a PipeParser, which handles the normal HL7 encoding
                var ourPipeParser = new PipeParser();

                // parse the message string into a Java message object
                var orderResultsHl7Message = ourPipeParser.Parse(messageString);

                // create a terser object instance by wrapping it around the message object
                var terser = new Terser(orderResultsHl7Message);

                // now, let us do various operations on the message
                var terserHelper = new OurTerserHelper(terser);

                var terserExpression = "MSH-6";
                var dataRetrieved    = terserHelper.GetData(terserExpression);
                LogToDebugConsole($"Field 6 of MSH segment using expression '{terserExpression}' was '{dataRetrieved}'");

                terserExpression = "/.PID-5-2"; // notice the /. to indicate relative position to root node
                dataRetrieved    = terserHelper.GetData(terserExpression);
                LogToDebugConsole($"Field 5 and Component 2 of the PID segment using expression '{terserExpression}' was {dataRetrieved}'");

                terserExpression = "/.*ID-5-2";
                dataRetrieved    = terserHelper.GetData(terserExpression);
                LogToDebugConsole($"Field 5 and Component 2 of the PID segment using wildcard-based expression '{terserExpression}' was '{dataRetrieved}'");

                terserExpression = "/.P?D-5-2";
                dataRetrieved    = terserHelper.GetData(terserExpression);
                LogToDebugConsole($"Field 5 and Component 2 of the PID segment using another wildcard-based expression '{terserExpression}' was '{dataRetrieved}'");

                terserExpression = "/.PV1-9(1)-1"; // note: field repetitions are zero-indexed
                dataRetrieved    = terserHelper.GetData(terserExpression);
                LogToDebugConsole($"2nd repetition of Field 9 and Component 1 for it in the PV1 segment using expression '{terserExpression}' was '{dataRetrieved}'");
            }
            catch (Exception e)
            {
                LogToDebugConsole($"Error occured while creating HL7 message {e.Message}");
            }
        }
Beispiel #7
0
        public void Test17142192()
        {
            // Arrange
            var input = "MSH|^~\\&|Send App|Send Fac|Rec App|Rec Fac|20070504141816||ORM^O01||P|2.3\r"
                        + "PID|||12345678||Lastname^^INI^^PREFIX||19340207|F|||Street 15^^S GRAVENHAGE^^2551HL^NEDERLAND|||||||||||||||NL\r"
                        + "ORC|NW|8100088345^ORDERNR||LN1||C|^^^20070504080000||20070504141816|||0^Doctor\r"
                        + "OBR|1|8100088345^ORDERNR||ADR^Something||||||||||||0^Doctor\r"
                        + "OBX|1|RP|ADR^Something||http://TRACEMASTERVUE/TMVWebAPIClient/ShowTIFFImage.aspx?ECGID=0595f00-317e-11e2-4823-00201fe00029||||||F\r";

            var sut = new PipeParser();

            // Act
            var message = sut.Parse(input);
            var encoded = sut.Encode(message);

            // Assert
            Assert.AreEqual(input, encoded);
        }
Beispiel #8
0
		public void TestAdtA04AndA01MessageStructure()
		{
			var result = PipeParser.GetMessageStructureForEvent("ADT_A04", "2.7.1");
			bool isSame = string.Compare("ADT_A01", result, StringComparison.InvariantCultureIgnoreCase) == 0;
			Assert.IsTrue(isSame, "ADT_A04 returns ADT_A01");

			result = PipeParser.GetMessageStructureForEvent("ADT_A13", "2.7.1");
			isSame = string.Compare("ADT_A01", result, StringComparison.InvariantCultureIgnoreCase) == 0;
			Assert.IsTrue(isSame, "ADT_A13 returns ADT_A01");

			result = PipeParser.GetMessageStructureForEvent("ADT_A08", "2.7.1");
			isSame = string.Compare("ADT_A01", result, StringComparison.InvariantCultureIgnoreCase) == 0;
			Assert.IsTrue(isSame, "ADT_A08 returns ADT_A01");

			result = PipeParser.GetMessageStructureForEvent("ADT_A01", "2.7.1");
			isSame = string.Compare("ADT_A01", result, StringComparison.InvariantCultureIgnoreCase) == 0;
			Assert.IsTrue(isSame, "ADT_A01 returns ADT_A01");
		}
        public void TestParseORL_O34(string version)
        {
            var message =
                $"MSH|^~\\&|LIS|LAB|HIS|HOSP_SYS|20110329142202||ORL^O34^ORL_O34|90|P|{version}\r"
                + "MSA|AA|12201\r"
                + "PID|1||32XX77^^^^HIS_PAC||SAMPLE^PATIENT^^^^^L||19981126|M\r"
                + "SPM|25081299|36201^0310170||K^kri-EDTA|||||||||||||20110329142201.267+0200|||||||||1\r"
                + "ORC|OK|36201|02000110170|40201|||||20110329142201.312+0200||||||||||||44129-A^^^^^^ORG^^^Redna ambulanta\r"
                + "TQ1|||||||||R\r"
                + "OBR||36201|02000110170|020001^K-Hemogram^KC_PEK_LIS_PRE||||||||||||12345^TEST^DOCTOR||||||||O\r"
                + "SPM|25081299|36201^0310170||K^kri-EDTA|||||||||||||20110329142201.267+0200|||||||||1\r";

            Console.WriteLine($"Testing ORL^O34 parse for version {version}");

            var parser = new PipeParser();

            Assert.DoesNotThrow(() => parser.Parse(message));
        }
        public void TestDHPatient1111111()
        {
            var parser = new PipeParser();

            var m = parser.Parse(GetDHPatient1111111());

            var orfR04 = m as ORF_R04;

            Assert.IsNotNull(orfR04);
            object range = orfR04.GetQUERY_RESPONSE().GetORDER().GetOBSERVATION().OBX.GetObservationValue(1);

            XMLParser xmlParser = new DefaultXMLParser();

            var recoveredMessage = xmlParser.Encode(orfR04);

            Assert.IsNotNull(recoveredMessage);
            Assert.IsFalse(recoveredMessage.IndexOf("NTE") > -1, "Returned Message added ORC segment.");
        }
Beispiel #11
0
        private string GetAck(HL7RequestInfo requestInfo, string error)
        {
            Ack      ack = new Ack(ConfigurationManager.AppSettings["CommunicationName"], ConfigurationManager.AppSettings["EnvironmentIdentifier"]);
            IMessage result;

            if (error == null)
            {
                result = ack.MakeACK(requestInfo.Message);
            }
            else
            {
                result = ack.MakeACK(requestInfo.Message, AckTypes.AE, error);
            }

            PipeParser parser = new PipeParser();

            return(parser.Encode(result));
        }
Beispiel #12
0
        public void TestStrictValidation_NegativeNumber(string message)
        {
            var     parser = new PipeParser();
            ORU_R01 oru;

            // default validation context should pass with no exceptions
            oru = (ORU_R01)parser.Parse(message);
            foreach (var obs in oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION().OBX.GetObservationValue())
            {
                Assert.IsTrue(obs.Data is SI);
            }

            // strict validation context should throw a DataTypeException for negative number values in a SI field.
            parser.ValidationContext = new StrictValidation();
            Assert.Throws <DataTypeException>(() => { oru = (ORU_R01)parser.Parse(message); },
                                              string.Format("Strict validation should throw a {0} when parsing a SI field with a negative value",
                                                            typeof(DataTypeException).Name));
        }
        public void ParseXMLToHL7()
        {
            var message = GetQRYR02XML();

            XMLParser xmlParser = new DefaultXMLParser();
            var       m         = xmlParser.Parse(message);

            var qryR02 = m as QRY_R02;

            Assert.IsNotNull(qryR02);

            var pipeParser = new PipeParser();

            var pipeOutput = pipeParser.Encode(qryR02);

            Assert.IsNotNull(pipeOutput);
            Assert.IsFalse(string.Empty.Equals(pipeOutput));
        }
        public void Parse_V24_ORM_O01()
        {
            var message =
                "MSH|^~\\&|sys1|sys1|sys2|sys2|20180503174921||ORM^O01|1234567890|P|2.4\r"
                + "PID|||1^^^XXX~2^^^YYY||LastName^FirstName||19660429|F\r"
                + "PV1||I|3906||||||||||||||||100001\r"
                + "ORC|CA|1410|3121||CA\r"
                + "OBR|1|1410|3121|RX50^ADDOME SUPINO";

            var parser = new PipeParser();

            var result = parser.Parse(message);

            var orm = result as NHapi.Model.V24.Message.ORM_O01;

            Assert.IsNotNull(orm);
            Assert.AreEqual("FirstName", orm.PATIENT.PID.GetPatientName(0).GivenName.Value);
        }
Beispiel #15
0
        private string GetAck(HL7RequestInfo requestInfo, string error)
        {
            Ack      ack = new Ack("NSSservice", "Development");
            IMessage result;

            if (error == null)
            {
                result = ack.MakeACK(requestInfo.Message);
            }
            else
            {
                result = ack.MakeACK(requestInfo.Message, AckTypes.AE, error);
            }

            PipeParser parser = new PipeParser();

            return(parser.Encode(result));
        }
Beispiel #16
0
        public override bool Send(IMessage msg)
        {
            try
            {
                string path = outputDir + GetFileName(msg);
                using (StreamWriter sw = new StreamWriter(File.OpenWrite(path)))
                {
                    PipeParser parser = new PipeParser();
                    sw.Write(parser.Encode(msg));
                }
            }
            catch (IOException)
            {
                return(false);
            }

            return(true);
        }
Beispiel #17
0
        public void TestOBR5RepeatingValuesMessage_DataTypesAndRepetitions()
        {
            var parser = new PipeParser();
            var oru    = (ORU_R01)parser.Parse(GetMessage());

            var expectedObservationCount          = 3;
            var parsedObservations                = oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).OBSERVATIONRepetitionsUsed;
            var parsedCorrectNumberOfObservations = parsedObservations == expectedObservationCount;

            Assert.IsTrue(
                parsedCorrectNumberOfObservations,
                $"Expected 3 OBX repetitions used for this segment, found {parsedObservations}");

            foreach (var obs in oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION().OBX.GetObservationValue())
            {
                Assert.IsTrue(obs.Data is FT);
            }
        }
Beispiel #18
0
        public void ParseXMLToHL7()
        {
            string message = GetQRYR02XML();

            XMLParser xmlParser = new DefaultXMLParser();
            IMessage  m         = xmlParser.Parse(message);

            QRY_R02 qryR02 = m as QRY_R02;

            Assert.NotNull(qryR02);

            PipeParser pipeParser = new PipeParser();

            string pipeOutput = pipeParser.Encode(qryR02);

            Assert.NotNull(pipeOutput);
            Assert.NotEqual(string.Empty, pipeOutput);
        }
Beispiel #19
0
        public void Test1714219()
        {
            // Arrange
            var input = "MSH|^~\\&|Send App|Send Fac|Rec App|Rec Fac|20070504141816||ORM^O01||P|2.2\r"
                        + "PID|||12345678||Lastname^^INI^^PREFIX||19340207|F|||Street 15^^S GRAVENHAGE^^2551HL^NEDERLAND|||||||||||||||NL\r"
                        + "ORC|NW|8100088345^ORDERNR||LN1||C|^^^20070504080000||20070504141816|||0^Doctor\r"
                        + "OBR|1|8100088345^ORDERNR||ADR^Something||||||||||||0^Doctor\r"
                        + "OBX|1|ST|ADR^Something||item1^item2^item3^^item5||||||F\r";

            var sut = new PipeParser();

            // Act
            var message = sut.Parse(input);
            var encoded = sut.Encode(message);

            // Assert
            Assert.AreEqual(input, encoded);
        }
Beispiel #20
0
        internal static string GetAckTypeFromRequest(string name, string version)
        {
            if (string.IsNullOrEmpty(name))
            {
                return(null);
            }

            if (name.StartsWith("ACK"))
            {
                return(null);
            }

            string responseType = null;

            if (!PipeParser.ValidVersion(version))
            {
                throw new HL7apiException("Invalid HL7 Version");
            }

            NameValueCollection p = GetMapFromRequest(name, version);

            if (!p.AllKeys.Contains(name))
            {
                return("ACK");
            }
            responseType = p.Get(name);
            if (responseType == null)
            {
                return(null);
            }
            else
            {
                if (responseType.Split(' ').Length > 1)
                {
                    responseType = responseType.Split(' ')[1];
                }
                else
                {
                    return(null);
                }
            }

            return(responseType);
        }
Beispiel #21
0
        public void TestORUR01_Enumerators()
        {
            string hl7Data = @"MSH|^~\&|Paceart|Medtronic|||20160628142621||ORU^R01^ORU_R01|20160628142621000001|P|2.6|||AL|NE|||||IHE_PCD_ORU_R01^IHE PCD^1.3.6.1.4.1.19376.1.6.1.9.1^ISO
PID|||MODEL:A3DR01 Advisa DR MRI/SERIAL:PZK600806S^^^MDT^U~^^^^Patient ID~A10000641^^^^Paceart||Patient^Test||19100000000000+0000
PV1|1|A
OBR|1||dfac748c-213c-e611-80c5-000c2996266c|754050^MDC_IDC_ENUM_SESS_TYPE_InClinic^MDC^INCLINIC^INCLINIC^MDT|||20160627041809+0000||||||||||||||||||P
OBX|1|ST|||TestString||||||P
OBX|2|NM|||9001||||||P
OBX|3|DTM|||20160627041809+0000||||||P";

            PipeParser parser = new PipeParser();
            IMessage   msg    = parser.Parse(hl7Data);

            Assert.IsNotNull(msg, "Message should not be null");
            ORU_R01 oruR01 = (ORU_R01)msg;

            Assert.AreEqual("R01", oruR01.MSH.MessageType.TriggerEvent.Value);
            Assert.AreEqual(null, oruR01.GetPATIENT_RESULT(0).PATIENT.PID.SetIDPID.Value);

            foreach (var result in oruR01.PATIENT_RESULTs)
            {
                foreach (var orderObservation in result.ORDER_OBSERVATIONs)
                {
                    int index = 1;
                    foreach (var observation in orderObservation.OBSERVATIONs)
                    {
                        if (index == 1)
                        {
                            Assert.IsTrue("ST" == observation.OBX.ValueType.Value);
                        }
                        else if (index == 2)
                        {
                            Assert.IsTrue("NM" == observation.OBX.ValueType.Value);
                        }
                        else if (index == 3)
                        {
                            Assert.IsTrue("DTM" == observation.OBX.ValueType.Value);
                        }
                        index++;
                    }
                    Assert.IsTrue(index == 4);
                }
            }
        }
        public void ParseORUr01LongToXml()
        {
            var message =
                "MSH|^~\\$|LAB|DHC|LCR|DH|200511291403||ORU^R01|52780002432|P|2.3.1\r"
                + "PID|0001|3013839|40206609||BARNES^TEST||19551005|F|||||||||||258452152\r"
                + "OBR||00009^001|W442|CBC^CBC|||200509210520||||||||CBC^CBC|117564^STEEL||||||||DAH\r"
                + "OBX|1|NM|WBC||20.0|k/uL|4.5-10.0|H|||Z\r"
                + "OBX|1|TX|WBC|1|(Ref Range: 4 k/uL)|k/uL|4.5-10.0||||Z\r"
                + "OBX|2|NM|RBC||4.00|M/uL|4.20-5.40|L|||Z\r"
                + "OBX|2|TX|RBC|1|(Ref Range: 4 M/uL)|M/uL|4.20-5.40||||Z\r"
                + "OBX|3|NM|HGB||12.0|g/dL|14.0-24.0|L|||Z\r"
                + "OBX|3|TX|HGB|1|(Ref Range: 1 g/dL)|g/dL|14.0-24.0||||Z\r"
                + "OBX|4|NM|HCT||41.0|%|37.0-47.0||||Z\r"
                + "OBX|4|TX|HCT|1|(Ref Range: 3 %)|%|37.0-47.0||||Z\r"
                + "OBX|5|NM|MCV||80.9|fl|80.0-100.0||||Z\r"
                + "OBX|5|TX|MCV|1|(Ref Range: 8 fl)|fl|80.0-100.0||||Z\r"
                + "OBX|6|NM|MCH||31.0|pg|27.0-31.0||||Z\r"
                + "OBX|6|TX|MCH|1|(Ref Range: 2 pg)|pg|27.0-31.0||||Z\r"
                + "OBX|7|NM|MCHC||32.0|g/dL|32.0-36.0||||Z\r"
                + "OBX|7|TX|MCHC|1|(Ref Range: 3 g/dL)|g/dL|32.0-36.0||||Z\r"
                + "OBX|8|NM|RDW||19.0|%|11.5-14.5|H|||Z\r"
                + "OBX|8|TX|RDW|1|(Ref Range: 1 %)|%|11.5-14.5||||Z\r"
                + "OBX|9|NM|PLTC||45|k/uL|150-400|PL^Y|||Z\r"
                + "OBX|9|TX|PLTC|1|(Ref Range: 1 k/uL)|k/uL|150-400||||Z\r"
                + "OBX|10|NM|MPV||10.0|fL|6.2-10.0||||Z\r"
                + "OBX|10|TX|MPV|1|(Ref Range: 6 fL)|fL|6.2-10.0||||Z";

            var parser = new PipeParser();

            var m = parser.Parse(message);

            var msg = m as ORU_R01;

            XMLParser xmlParser = new DefaultXMLParser();

            var recoveredMessage = xmlParser.Encode(msg);

            Assert.AreNotEqual(string.Empty, recoveredMessage);

            var orrDoc = new XmlDocument();

            orrDoc.LoadXml(recoveredMessage);
            Assert.IsNotNull(orrDoc);
        }
Beispiel #23
0
        private static void TestGenericMessageWrapper()
        {
            Console.WriteLine("\n==============================================\nTesting parsing to GenericMessageWrapper with different PID implementation (Repeating Alternate Patient ID).");
            var txtMessage = "MSH|^~\\&|EPIC|EPICADT|SMS|SMSADT|199912271408|CHARRIS|ADT^A01^ADT_A01|1817457|D|2.3|\rPID|0493575^^^2^ID 1|0493575^^^2^ID 1|454721|0493575^^^2^ID 1~0584484^^^3^ID 2~0584484^^^4^ID 4~0584484^^^5^ID 5|DOE^JOHN^^^^|DOE^JOHN^^^^|19480203|M||B|254 MYSTREET AVE^^MYTOWN^OH^44123^USA||(216)123-4567|||M|NON|400003403~1129086|\rNK1||ROE^MARIE^^^^|SPO||(216)123-4567||EC|||||||||||||||||||||||||||\rPV1||O|168~219^^^^^^^^^||||277^ALLEN MYLASTNAME^BONNIE^^^^|||||||||| ||2688684|||||||||||||||||||||||||199912271408||||||002376853";

            var emch   = new EnhancedModelClassFactory();
            var parser = new PipeParser(emch);

            emch.ValidationContext = parser.ValidationContext;
            var im = parser.Parse(txtMessage);

            var gcw = im as GenericMessageWrapper;

            if (gcw != null)
            {
                var originalMessage = gcw.Unwrap();

                var segmentOverridden = false;
                var pid = gcw.GetSegment <ISegment>("PID");
                if (pid is CustomImplementation.V23.Segment.PID)
                {
                    segmentOverridden = true;
                }

                var structure = originalMessage.GetStructureName();
                if (segmentOverridden)
                {
                    Console.WriteLine("Parsed {0} (V{1}). Custom PID implementation: {2}. Alternate Patient ID has {3} repetitions.", structure, originalMessage.Version, segmentOverridden, ((CustomImplementation.V23.Segment.PID)pid).AlternatePatientIDRepetitionsUsed);

                    var pid1 = ((ADT_A01)originalMessage).PID;
                    var pid2 = (CustomImplementation.V23.Segment.PID)pid;

                    Console.WriteLine("");
                    Console.WriteLine("Compare PID segments.");
                    Console.WriteLine("PID from original message {0} custom PID.", pid1.IsEqual(pid2) ? "is the same as" : "isn't the same as");
                }
                else
                {
                    Console.WriteLine("Parsed {0} (V{1}). Custom PID implementation: {2}.", structure,
                                      originalMessage.Version, segmentOverridden);
                }
            }
            Console.WriteLine("\nDone!");
        }
Beispiel #24
0
        public static void DSRequestSampleData(string sample_id, int device)//处理生化仪申请消息  QRY_Q02
        {
            //device目前用不到
            HL7Manager.HL7RequestStruct hl7request = new HL7Manager.HL7RequestStruct();

            PipeParser Parser = new PipeParser();
            QRY_Q02    qryQ02 = new QRY_Q02();

            #region QRY_Q02样本申请封装
            qryQ02.MSH.FieldSeparator.Value                 = "|";
            qryQ02.MSH.EncodingCharacters.Value             = @"^~\&";
            qryQ02.MSH.SendingApplication.NamespaceID.Value = GlobalVariable.Manufacturer;
            qryQ02.MSH.SendingFacility.NamespaceID.Value    = GlobalVariable.DSDeviceID;
            qryQ02.MSH.DateTimeOfMessage.TimeOfAnEvent.SetLongDate(DateTime.Now);
            qryQ02.MSH.MessageType.MessageType.Value   = "QRY";
            qryQ02.MSH.MessageType.TriggerEvent.Value  = "Q02";
            qryQ02.MSH.MessageControlID.Value          = "1";
            qryQ02.MSH.ProcessingID.ProcessingID.Value = "P";
            qryQ02.MSH.VersionID.VersionID.Value       = "2.3.1";
            qryQ02.MSH.GetCharacterSet(0).Value        = GlobalVariable.SocketCode ? "ASCII" : "UTF8";

            qryQ02.QRD.QueryDateTime.TimeOfAnEvent.SetLongDate(DateTime.Now);
            qryQ02.QRD.QueryFormatCode.Value   = "R";
            qryQ02.QRD.QueryPriority.Value     = "D";
            qryQ02.QRD.QueryID.Value           = "1";
            qryQ02.QRD.QueryResultsLevel.Value = "RD";
            qryQ02.QRD.GetWhoSubjectFilter(0).IDNumber.Value    = sample_id;//就为了这句话
            qryQ02.QRD.GetWhatSubjectFilter(0).Identifier.Value = "OTH";
            qryQ02.QRD.QueryResultsLevel.Value = "T";

            qryQ02.QRF.GetWhereSubjectFilter(0).Value = GlobalVariable.DSDeviceID;
            qryQ02.QRF.WhenDataEndDateTime.TimeOfAnEvent.SetLongDate(DateTime.Now);
            qryQ02.QRF.WhenDataStartDateTime.TimeOfAnEvent.SetLongDate(DateTime.Now);
            qryQ02.QRF.GetWhichDateTimeQualifier(0).Value       = "RCT";
            qryQ02.QRF.GetWhichDateTimeStatusQualifier(0).Value = "COR";
            qryQ02.QRF.GetDateTimeSelectionQualifier(0).Value   = "ALL";
            #endregion

            hl7request.HL7RequestMessage = Parser.Encode(qryQ02);
            hl7request.RequestDevice     = GlobalVariable.DSDeviceID;
            hl7request.RequestSample_ID  = sample_id;
            hl7Manager.AddHL7RequestSampleData(hl7request);
        }
Beispiel #25
0
        public void FromMessage_NoFieldSeperatorCharacterInMessage_ThrowsHl7Exception()
        {
            // Arrange
            var input = "MSH|^~\\&|sys1|sys1|sys2|sys2|20180503174921||ORM^O01|1234567890|P|2.3\r"
                        + "PID|||1^^^XXX~2^^^YYY||LastName^FirstName||19660429|F\r"
                        + "PV1||I|3906||||||||||||||||100001\r"
                        + "ORC|CA|1410|3121||CA\r"
                        + "OBR|1|1410|3121|RX50^ADDOME SUPINO";

            var parser  = new PipeParser();
            var message = parser.Parse(input);
            var terser  = new Terser(message);

            terser.Set("MSH-1", null);

            // Action / Assert
            Assert.Throws <HL7Exception>(
                () => EncodingCharacters.FromMessage(message));
        }
Beispiel #26
0
        /// <summary>
        /// Handle PIX Update
        /// </summary>
        private IMessage HandlePixUpdate(NHapi.Model.V231.Message.ADT_A08 aDT_A08, Hl7MessageReceivedEventArgs e)
        {
            ILocalizationService        locale = this.Context.GetService(typeof(ILocalizationService)) as ILocalizationService;
            ISystemConfigurationService config = this.Context.GetService(typeof(ISystemConfigurationService)) as ISystemConfigurationService;

            PipeParser parser = new PipeParser();

            aDT_A08.MSH.MessageType.MessageStructure.Value = "ADT_A01";
            var message = parser.Parse(parser.Encode(aDT_A08));

            if (message is NHapi.Model.V231.Message.ADT_A01)
            {
                return(this.HandlePixUpdate(message as NHapi.Model.V231.Message.ADT_A01, e));
            }
            else
            {
                return(MessageUtil.CreateNack(e.Message, "AR", "200", locale.GetString("MSGE074"), config));
            }
        }
Beispiel #27
0
        private static void ParserCustomMessageHL7()
        {
            const string customSegmentBasedHl7Message = "MSH|^~\\&|SUNS1|OVI02|AZIS|CMD|200606221348||ADT^A01|1049691900|P|2.3\r"
                                                        + "EVN|A01|200803051509||||200803031508\r"
                                                        + "PID|||5520255^^^PK^PK~ZZZZZZ83M64Z148R^^^CF^CF~ZZZZZZ83M64Z148R^^^SSN^SSN^^20070103^99991231~^^^^TEAM||ZZZ^ZZZ||19830824|F||||||||||||||||||||||N\r"
                                                        + "ZPV|Some Custom Notes|Additional custom description of the visit goes here";
            var parserPipe    = new PipeParser();
            var parsedMessage = parserPipe.Parse(customSegmentBasedHl7Message, "2.3.CustomZSegments");

            LogToDebugConsole("Type: " + parsedMessage.GetType());

            var zpvA01 = (CustomSegment.ADT_A01)parsedMessage;

            if (zpvA01 != null)
            {
                LogToDebugConsole(zpvA01.ZPV.CustomNotes.Value);
                LogToDebugConsole(zpvA01.ZPV.CustomDescription.Value);
            }
        }
        public void ParseORFR04()
        {
            string message = @"MSH|^~\&|Query Result Locator|Query Facility Name|Query Application Name|ST ELSEWHERE HOSPITAL|20051024074506||ORF^R04|432|P|2.3|
MSA|AA|123456789|
QRD|20060228160421|R|I||||10^RD&Records&0126|38923^^^^^^^^&TCH|||
QRF||20050101000000||
PID|||38923^^^ST ELSEWHERE HOSPITAL Medical Record Numbers&              MEDIC              AL RECORD NUMBER&ST ELSEWHERE HOSPITAL^MR^ST ELSEWHERE HOSPITAL||Bombadill^Tom||19450605|M|||1&Main Street^^Littleton^CO^80122||^^^^^303^4376329^22|
OBR|1|0015566|DH2211223|83036^HEMOGLOBIN A1C^^83036^HEMOGLOBIN A1C|||20040526094000|||||||20040526094000||J12345^JENS^JENNY^^^DR^MD^^^^^^^112233&TCH|||||          TP QUEST DIAGNOSTICS-TAMPA 4225 E. FOWLER AVE TAMPA          FL 33617|20030622070400|||F|
OBX|1|NM|50026400^HEMOGLOBIN A1C^^50026400^HEMOGLOBIN A1C||12|^% TOTAL HGB|4.0 - 6.0|H|||F|||20040510094000|TP^^L|";

            PipeParser parser = new PipeParser();

            IMessage m = parser.Parse(message);

            ORF_R04 orfR04 = m as ORF_R04;

            Assert.IsNotNull(orfR04);
            Assert.AreEqual("12", orfR04.GetQUERY_RESPONSE().GetORDER().GetOBSERVATION().OBX.GetObservationValue()[0].Data.ToString());
        }
        public void Should_not_parse_Int_when_not_digit()
        {
            for (int i = 0; i < char.MaxValue; i++)
            {
                char c            = (char)i;
                var  charAsString = c.ToString().ToReadOnlySequence();

                if (c >= '0' && c <= '9')
                {
                    var worked = PipeParser.TryParsePositiveInteger(charAsString, out var _);
                    Assert.True(worked);
                }
                else
                {
                    var worked = PipeParser.TryParsePositiveInteger(charAsString, out var _);
                    Assert.False(worked);
                }
            }
        }
Beispiel #30
0
        public void ParseADTA01()
        {
            var message = "MSH|^~\\&|ADT|Admitting|RADIO|ARTEFACT|200710061035||ADT^A01|00000040|P|2.1\r"
                          + "EVN|A01|200710061035\r"
                          + "PID||1144270^4^M10|0699999^2^M10||XXXXXX|XXXCXCXX|20071006|F|||10 THE ADDRESS||(450)999-9999|||S||||||||||||||N\r"
                          + "NK1|1\r"
                          + "PV1||I|19^D415^01P|05|07008496||180658^DOCTOR NAME|||81|||||||180658^DOCTOR NAME|NN||01||||||||||||||||||||||||200710061018\r"
                          + "DG1|1|I9|412|NAISSANCE||01\r"
                          + "Z01|1||S|NOUVEAU-NE||FATHER NAME^D|||||0||||A||||||N|||1|GFATHER NAME|G-PERE||(450)432-9999|21||S||20071006101800||N||0||||0000000000||||||||00000000000000|00000000||||||||||01|00000000|00000000000000|05|00|75017|00|00|||||||||||||||||||000000000|000000000|||00000000000000|||01|0";

            var parser = new PipeParser();

            var m = parser.Parse(message);

            var parsedMessage = m as ADT_A01;

            Assert.IsNotNull(parsedMessage);
            Assert.AreEqual("1144270", parsedMessage.PID.PATIENTIDEXTERNALEXTERNALID.IDNumber.Value);
        }
Beispiel #31
0
        public void Test_26DataTypesParseCorrectly()
        {
            var message =
                "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.6|||AL|||ASCII\r"
                + "PID|1||1711114||Appt^Test||19720501||||||||||||001020006\r"
                + "ORC|||||F\r"
                + "OBR|1|||ehipack^eHippa Acknowlegment|||200610120839|||||||||00002^eProvider^Electronic|||||||||F\r"
                + "OBX|1|DT|||DTValue||||||F\r"
                + "OBX|2|ST|||STValue||||||F\r"
                + "OBX|3|TM|||TMValue||||||F\r"
                + "OBX|4|ID|||IDValue||||||F\r"
                + "OBX|5|IS|||ISValue||||||F";

            var parser = new PipeParser();
            var oru    = new ORU_R01();

            oru = (ORU_R01)parser.Parse(message);

            var expectedObservationCount          = 5;
            var parsedObservations                = oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).OBSERVATIONRepetitionsUsed;
            var parsedCorrectNumberOfObservations = parsedObservations == expectedObservationCount;

            Assert.IsTrue(
                parsedCorrectNumberOfObservations,
                string.Format("Expected {1} OBX repetitions used for this segment, found {0}", parsedObservations, expectedObservationCount));

            var index = 0;
            var obs   = oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(index).OBX.GetObservationValue().FirstOrDefault();

            Assert.IsTrue(obs.Data is DT);
            index++;
            obs = oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(index).OBX.GetObservationValue().FirstOrDefault();
            Assert.IsTrue(obs.Data is ST);
            index++;
            obs = oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(index).OBX.GetObservationValue().FirstOrDefault();
            Assert.IsTrue(obs.Data is TM);
            index++;
            obs = oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(index).OBX.GetObservationValue().FirstOrDefault();
            Assert.IsTrue(obs.Data is ID);
            index++;
            obs = oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(index).OBX.GetObservationValue().FirstOrDefault();
            Assert.IsTrue(obs.Data is IS);
        }