예제 #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);
            }
        }
예제 #2
0
        public void TestGithubIssue24CantGetIN1Segment()
        {
            string message = @"MSH|^~\&|SUNS1|OVI02|AZIS|CMD|200606221348||ADT^A01|1049691900|P|2.4
	EVN|A01|200601060800
	PID||8912716038^^^51276|0216128^^^51276||BARDOUN^LEA SACHA||19981201|F|||AVENUE FRANC GOLD 8^^LUXEMBOURGH^^6780^150||053/12456789||N|S|||99120162652||^^^|||||B
	PV1||O|^^|U|||07632^MORTELO^POL^^^DR.|^^^^^|||||N||||||0200001198
	PV2|||^^AZIS||N|||200601060800
	IN1|0001|2|314000|||||||||19800101|||1|BARDOUN^LEA SACHA|1|19981201|AVENUE FRANC GOLD 8^^LUXEMBOURGH^^6780^150|||||||||||||||||
	ZIN|0164652011399|0164652011399|101|101|45789^Broken bone"    ;

            var parser          = new PipeParser();
            var abstractMessage = parser.Parse(message);

            var typedMessage = abstractMessage as ADT_A01;

            // This is supposed to throw an exception with error 'IN1 does not exist in the group NHapi.Model.V24.Message.ADT_A01'
            Assert.Throws <HL7Exception>(delegate
            {
                var causesException = (IN1)typedMessage.GetStructure("IN1");
            });

            // This will work as the IN1 resides within the insurance group's structure
            var in1 = (IN1)typedMessage.GetINSURANCE(0).GetStructure("IN1");

            // old style of accessing the data
            Assert.IsTrue(typedMessage.GetINSURANCE(0).IN1.SetIDIN1.Value == "0001");

            // new style of accessing the data
            Assert.IsTrue(typedMessage.INSURANCEs.First().IN1.SetIDIN1.Value == "0001");
        }
예제 #3
0
파일: Program.cs 프로젝트: cprafael10/HL7
        static void Main(string[] args)
        {
            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 enhancedModelClassFactory = new EnhancedModelClassFactory();
            var pipeParser = new PipeParser(enhancedModelClassFactory);

            enhancedModelClassFactory.ValidationContext = pipeParser.ValidationContext;

            LogToDebugConsole("Attempting to parse message string into HL7 message object...");

            var ourHl7Message = pipeParser.Parse(customSegmentBasedHl7Message);

            LogToDebugConsole("Parsed message into generic ADT_A01 message successfully...");

            LogToDebugConsole("Unwrapping payload from our custom ADT_A01 message using GenericMessageWrapper class...");

            var wrappedGenericMessage = ourHl7Message as GenericMessageWrapper;
            var originalMessage       = wrappedGenericMessage?.Unwrap();

            if (wrappedGenericMessage?.GetSegment <ISegment>("ZPV") != null)
            {
                LogToDebugConsole("Casting unwrapped payload into our custom ADT A01 class...");
                //casting to our custom class and retrieving the custom segment within it
                var zpvSegment = ((NHapi.Model.CustomZSegments.Message.ADT_A01)originalMessage).ZPV;
                LogToDebugConsole($"Custom Notes retrieved from ZPV segment was -> {zpvSegment.CustomNotes.Value}");
                LogToDebugConsole($"Custom Description retrieved from ZPV segment was -> {zpvSegment.CustomDescription.Value}");
                LogToDebugConsole("Entire parse operation completed successfully...");
            }
        }
예제 #4
0
        public void ParseORMo01ToXml()
        {
            string Message = @"MSH|^~\&|INVISION|DHC|SUNQUEST LAB||200606191615||ORM^O01|ORDR|P|2.3.1|LAB
PID|0001||3020956||TRAINONLYPOE^ONE||19770903|F||W||||||||40230443
PV1|0001|I|MICU^W276^01||||045716^ABAZA, MONA M|||MED|||||||045716|F|000000030188
ORC|NW|01444^00001|||||||||||L
OBR||01444^00001||CAI^CALCIUM IONIZED|||200606191614||||L|||||045716^STEELE, ANDREW W|||||||||||00001&UNITS^ONCE&ONCE^000^200606191614^200606191614^ROUTINE
";

            PipeParser Parser = new PipeParser();

            IMessage m = Parser.Parse(Message);

            ORM_O01 ormo01 = m as ORM_O01;

            XMLParser xmlParser = new DefaultXMLParser();

            string recoveredMessage = xmlParser.Encode(ormo01);

            Assert.AreNotEqual(string.Empty, recoveredMessage);

            XmlDocument ormDoc = new XmlDocument();

            ormDoc.LoadXml(recoveredMessage);
            Assert.IsNotNull(ormDoc);
        }
예제 #5
0
        public void ParseORMwithOBXToXML()
        {
            string Message = @"MSH|^~\&|INVISION|DHC|SUNQUEST LAB||200606191615||ORM^O01|ORDR|P|2.3.1|LAB
PID|0001||3020956||TRAINONLYPOE^ONE||19770903|F||W||||||||40230443
PV1|0001|I|MICU^W276^01||||045716^ABAZA, MONA M|||MED|||||||045716|F|000000030188
ORC|NW|01444^00001|||||||||||L
OBR||01444^00001||CAI^CALCIUM IONIZED|||200606191614||||L|||||045716^STEELE, ANDREW W|||||||||||00001&UNITS^ONCE&ONCE^000^200606191614^200606191614^ROUTINE
OBX||NM|||999||||||
OBX||NM|||999||||||
OBX||NM|||999||||||";

            PipeParser Parser = new PipeParser();

            IMessage m = Parser.Parse(Message);

            ORM_O01 msgObj = m as ORM_O01;

            Assert.IsNotNull(msgObj);

            XMLParser xmlParser = new DefaultXMLParser();

            string recoveredMessage = xmlParser.Encode(msgObj);

            Assert.IsNotNull(recoveredMessage);
            Assert.IsFalse(string.Empty.Equals(recoveredMessage));
        }
예제 #6
0
        public void TestGithubIssue25CantGetRepetition()
        {
            string message = @"MSH|^~\&|MILL|EMRY|MQ|EMRY|20150619155451||ADT^A08|Q2043855220T2330403781X928163|P|2.3||||||8859/1
EVN|A08|20150619155451
PID|1|935307^^^EUH MRN^MRN^EH01|25106376^^^TEC MRN~1781893^^^CLH MRN~935307^^^EUH MRN~5938067^^^EMPI|1167766^^^CPI NBR^^EXTERNAL~90509411^^^HNASYSID~10341880^^^HNASYSID~50627780^^^HNASYSID~5938067^^^MSG_CERNPHR|Patient^Test^Test^^^^Cur_Name||19400101|F||WHI|123 ENDOFTHE RD^UNIT 123^ATLANTA^GA^40000^USA^HOME^^||5555555555^HOME~6666666666^[email protected]^EMAIL|6666666666^BUS|ENG|M|OTH|12345665161^^^EUH FIN^FIN NBR^EH01|123454103|GA123450071||Non-Hispanic|||0|""|""|""||N";

            PipeParser parser = new PipeParser();

            IMessage m = parser.Parse(message);

            ADT_A01 adtA01 = m as ADT_A01;             // a08 is mapped to a01

            Assert.IsNotNull(adtA01);

            for (int rep = 0; rep < adtA01.PID.PatientIDInternalIDRepetitionsUsed; rep++)
            {
                var cx = adtA01.PID.GetPatientIDInternalID(rep);
                Console.WriteLine(cx.ID.Value);
            }

            for (int rep = 0; rep < adtA01.PID.AlternatePatientIDRepetitionsUsed; rep++)
            {
                var cx = adtA01.PID.GetAlternatePatientID(rep);
                Console.WriteLine(cx.ID.Value);
            }
        }
예제 #7
0
        public void ParseORMo01PIDSegment()
        {
            var message =
                "MSH|^~\\&|INVISION|DHC|SUNQUEST LAB||200606191615||ORM^O01|ORDR|P|2.3.1|LAB\r"
                + "PID|0001||3020956||TRAINONLYPOE^ONE||19770903|F||W||||||||40230443\r"
                + "PV1|0001|I|MICU^W276^01||||045716^ABAZA, MONA M|||MED|||||||045716|F|000000030188\r"
                + "ORC|NW|01444^00001|||||||||||L\r"
                + "OBR||01444^00001||CAI^CALCIUM IONIZED|||200606191614||||L|||||045716^STEELE, ANDREW W|||||||||||00001&UNITS^ONCE&ONCE^000^200606191614^200606191614^ROUTINE";

            var parser = new PipeParser();

            var m = parser.Parse(message);

            var ormo01 = m as ORM_O01;

            Assert.IsNotNull(ormo01);
            Assert.AreEqual("TRAINONLYPOE", ormo01.PATIENT.PID.GetPatientName()[0].FamilyLastName.FamilyName.Value);
            Assert.AreEqual("19770903", ormo01.PATIENT.PID.DateTimeOfBirth.TimeOfAnEvent.Value);
            Assert.AreEqual("F", ormo01.PATIENT.PID.Sex.Value);
            Assert.AreEqual("W", ormo01.PATIENT.PID.GetRace()[0].Identifier.Value);

            Assert.AreEqual(
                "ABAZA, MONA M",
                ormo01.PATIENT.PATIENT_VISIT.PV1.GetAttendingDoctor(0).FamilyLastName.FamilyName.Value);
        }
        public IList <Medication> parse(string message)
        {
            PipeParser parser  = new PipeParser();
            RTB_K13    rtb_k13 = (RTB_K13)parser.Parse(message);

            string responseStatus = rtb_k13.QAK.QueryResponseStatus.Value;

            if (String.Equals("NF", responseStatus, StringComparison.CurrentCultureIgnoreCase))
            {
                // TODO - see RxProfileDecoder.decode
                return(null);
            }

            if (!String.Equals("OK", responseStatus, StringComparison.CurrentCultureIgnoreCase))
            {
                throw new MdoException("Received processing error: " + message);
            }

            int recordCount         = Int32.Parse(rtb_k13.QAK.ThisPayload.Value);
            IList <Medication> meds = new List <Medication>();

            for (int i = 0; i < recordCount; i++)
            {
                RDT rdt = rtb_k13.ROW_DEFINITION.GetRDT(i);
                meds.Add(buildMedication(rdt));
            }

            return(meds);
        }
예제 #9
0
        public static void Main(string[] args)
        {
            try
            {
                // instantiate a PipeParser, which handles the "traditional or default encoding"
                var ourPipeParser = new PipeParser();
                // parse the string format message into a Java message object
                var hl7Message = ourPipeParser.Parse(File.ReadAllText(OruR01MessageWithBase64EncodedPdfReportIncluded, Encoding.UTF8));

                //cast to message to an ORU R01 message in order to get access to the message data
                var oruR01Message = hl7Message as ORU_R01;
                if (oruR01Message != null)
                {
                    // Display the updated HL7 message using Pipe delimited format
                    LogToDebugConsole("Parsed HL7 Message:");
                    LogToDebugConsole(ourPipeParser.Encode(hl7Message));

                    var encapsulatedPdfDataInBase64Format = ExtractEncapsulatedPdfDataInBase64Format(oruR01Message);

                    //if no encapsulated data was found, you can cease operation
                    if (encapsulatedPdfDataInBase64Format == null)
                    {
                        return;
                    }

                    var extractedPdfByteData = GetBase64DecodedPdfByteData(encapsulatedPdfDataInBase64Format);

                    WriteExtractedPdfByteDataToFile(extractedPdfByteData);
                }
            }
            catch (Exception e)
            {
                LogToDebugConsole($"Error occured during Order Response PDF extraction operation -> {e.StackTrace}");
            }
        }
예제 #10
0
        public void TestORMDescriptionExtract()
        {
            var parser  = new PipeParser();
            var results = (ORM_O01)parser.Parse(MessageORMSample);

            Assert.AreEqual(results.PATIENT.PID.DateTimeOfBirth.Description, @"Date/Time Of Birth");
        }
        public void Obx5DataTypeIsSetFromObx2_WhenObx2IsAnInvalidTypeAndInvalidOptionIsSet_ConfiguredInvalidTypeIsUsed()
        {
            var expectedObservationValueType = typeof(Model.V23.Datatype.ST);

            var message =
                "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.3|||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|BAD|||STValue||||||F\r";

            var parser  = new PipeParser();
            var options = new ParserOptions {
                InvalidObx2Type = "ST"
            };

            var parsed = (Model.V23.Message.ORU_R01)parser.Parse(message, options);

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

            Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType);
            Assert.AreEqual("STValue", ((IPrimitive)actualObservationValueType).Value);
        }
예제 #12
0
파일: Program.cs 프로젝트: cprafael10/HL7
        private static void DemonstrateConfigurableContextPidSegmentIsMissing()
        {
            try
            {
                //ADT A01 message with missing PID segment
                const string adtMessageWithPidSegmentMissing =
                    "MSH|^~\\&|SENDING_APPLICATION|SENDING_FACILITY|RECEIVING_APPLICATION|RECEIVING_FACILITY|" +
                    "20110613083617||ADT^A01|2323232223232|P|2.3||||\r" +
                    "EVN|A01|20110613083617||Some Reason|\r" +
                    "PV1|1|O|||||^^^^^^^^|^^^^^^^^";;

                LogToDebugConsole("Demonstration of NHAPI Tools Configurable Context...");
                LogToDebugConsole("Validation rule specified in app.config called 'MandatorySegmentADT_A01_PID' should fail here...");

                var parser = new PipeParser();

                //this should load the
                var context = new ConfigurableContext(parser.ValidationContext);
                parser.ValidationContext = context;

                //parse the message containing PID message segment
                //this should trigger a validation exception
                parser.Parse(adtMessageWithPidSegmentMissing);
            }
            catch (System.Exception ex)
            {
                LogToDebugConsole("Validation exception thrown...");
                if (ex.InnerException != null)
                {
                    LogToDebugConsole("Configurable Context-based Validation: Message failed during parsing:" +
                                      ex.InnerException.Message);
                }
            }
        }
예제 #13
0
        public void WhenMessageParsedAndEscaped_ThenEncodedAndUnescaped_MessageIsIdentical_Concurrent()
        {
            // Arrange
            var expected
                = "MSH|^~\\&|ULTRA|TML|OLIS|OLIS|200911231509||ORU^R01|5951|T|2.3\r" +
                  "PID|||7005728^^^TML^MR||LEIGHTON^RACHEL^DIAMOND||19310313|F|||200 ANYWHERE ST^^TORONTO^ON^M6H 2T9||(416)888-8888||||||1014071185^KR\r" +
                  "PV1|1||OLIS||||OLIST^BLAKE^DONALD^THOR^^^^^921379^^^^OLIST|||||||||^N\r" +
                  "ORC|RE||T09-106575-CHO-0^^OLIS_Site_ID^ISO|||||||||OLIST^BLAKE^DONALD^THOR^^^^L^921379\r" +
                  "OBR|0||T09-106575-CHO-0^^OLIS_Site_ID^ISO|CHO^CHOLESTEROL (SERUM)^HL79901 literal|||200911231455|||||||200911231455||OLIST^BLAKE^DONALD^THOR^^^^L^921379||10015716|10015716|T09-106575|MOHLTC|200911231509||B1|F||1^^^200911231455^^R\r" +
                  "NTE|1|L|\\.br\\                  Lipid - Target Levels for Treatment \\.br\\\\.br\\  ****************************************************************\\.br\\  \\F\\  Risk   \\F\\                  \\F\\                                 \\F\\\\.br\\  \\F\\ Level   \\F\\ 10-year CAD risk \\F\\         Recommendations         \\F\\\\.br\\  \\F\\---------\\F\\------------------\\F\\---------------------------------\\F\\\\.br\\  \\F\\         \\F\\                  \\F\\Treatment targets:               \\F\\\\.br\\  \\F\\High*    \\F\\      >=20%       \\F\\ Primary:   LDL-C    <2.0 mmol/L \\F\\\\.br\\  \\F\\         \\F\\                  \\F\\ Secondary: TC/HDL-C <4.0        \\F\\\\.br\\  \\F\\---------\\F\\------------------\\F\\---------------------------------\\F\\\\.br\\  \\F\\         \\F\\                  \\F\\Treat when:                      \\F\\\\.br\\  \\F\\Moderate \\F\\    10 - 19 %     \\F\\            LDL-C    >=3.5 mmol/L\\F\\\\.br\\  \\F\\         \\F\\                  \\F\\         or TC/HDL-C >=5.0       \\F\\\\.br\\  \\F\\---------\\F\\------------------\\F\\---------------------------------\\F\\\\.br\\  \\F\\         \\F\\                  \\F\\Treat when:                      \\F\\\\.br\\  \\F\\Low      \\F\\      <10%        \\F\\            LDL-C    >=5.0 mmol/L\\F\\\\.br\\  \\F\\         \\F\\                  \\F\\         or TC/HDL-C >=6.0       \\F\\\\.br\\****************************************************************\\.br\\  Notes:\\.br\\  *  10-year coronary artery disease (CAD) risk is accessed by\\.br\\     Framingham risk estimate tables.\\.br\\  *  *High risk includes CAD, peripheral artery disease, cerebro-\\.br\\     vascular disease (CVD) and most patients with chronic kidney\\.br\\     disease or established diabetes mellitus.\\.br\\  *  The patient must have been fasting for at least 12 hours prior\\.br\\     to taking ablood sample.\\.br\\  *  Calculation:  LDL-C (mmol/L) = Chol - (HDL-C + 0.46 x TG).\\.br\\     Calculation is invalid if TG exceed 4.5 mmol/L.\\.br\\  Ref:  McPherson R et al. Can J Cardiol. 2006 Sep;22(11):913-27\r" +
                  "OBX|1|NM|Z049107^Cholesterol-serum^L||2.30|mmol/L|||||F|||200911231508|STP\r" +
                  "OBX|2|FT|Z101068^Tech Comment^L||Lab STP||||||F|||200911231508|STP\r";

            var parser = new PipeParser {
                ValidationContext = new DefaultValidation()
            };

            ORU_R01 oruR01;
            string  actual;

            Parallel.For(0, 10, _ =>
            {
                // Arrange
                // Act
                oruR01 = (ORU_R01)parser.Parse(expected);
                actual = parser.Encode(oruR01);

                // Assert
                Assert.AreEqual(expected, actual);
            });
        }
        public void TestUch25Parse_Simple()
        {
            PipeParser parser = new PipeParser();
            ADT_A01    msg    = (ADT_A01)parser.Parse(GetSimpleMessage(), Constants.VERSION_25_UCH);

            Assert.IsNotNull(msg);
        }
예제 #15
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.True(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); });
		}
        public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed()
        {
            var expectedObservationValueType = typeof(ST);

            var message =
                "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.7|||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||||STValue||||||F\r";

            var parser  = new PipeParser();
            var options = new ParserOptions {
                DefaultObx2Type = "ST"
            };

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

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

            Assert.AreEqual("ST", obx2.Value);
            Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType);
            Assert.AreEqual("STValue", ((ST)actualObservationValueType).Value);
        }
예제 #17
0
        private void BgwParse_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                string   data             = File.ReadAllText(_hl7DataFile);
                string[] stringSeparators = new string[] { "\r\n" };
                this._hl7DataList = data.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);
            }
            catch (Exception ex)
            {
                LogError(string.Format("Failed to parse the data file. ERROR: {0}", ex.Message));
                _isSuccess = false;
            }

            for (int x = 0; x <= this._hl7DataList.Length - 1; x++)
            {
                try
                {
                    PipeParser parser = new PipeParser();
                    HL7Message msg    = parser.Parse(_hl7DataList[x]);
                    lstFileData.Items.Add(msg);
                }
                catch (ParserException ex)
                {
                    LogError(string.Format("Failed to parse. ERROR: {0}", ex.Message));
                    _isSuccess = false;
                }
            }
        }
예제 #18
0
        public void ParseORFR04ToXmlNoNTE()
        {
            var message =
                "MSH|^~\\&|Query Result Locator|Query Facility Name|Query Application Name|ST ELSEWHERE HOSPITAL|20051024074506||ORF^R04|432|P|2.3.1|\r"
                + "MSA|AA|123456789|\r"
                + "QRD|20060228160421|R|I||||10^RD&Records&0126|38923^^^^^^^^&TCH|||\r"
                + "QRF||20050101000000||\r"
                + "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|\r"
                + "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|\r"
                + "OBX|1|NM|50026400^HEMOGLOBIN A1C^^50026400^HEMOGLOBIN A1C||12|^% TOTAL HGB|4.0 - 6.0|H|||F|||20040510094000|TP^^L|";

            var parser = new PipeParser();

            var m = parser.Parse(message);

            var orfR04 = m as ORF_R04;

            Assert.IsNotNull(orfR04);

            XMLParser xmlParser = new DefaultXMLParser();

            var recoveredMessage = xmlParser.Encode(orfR04);

            Assert.IsNotNull(recoveredMessage);
            Assert.IsFalse(recoveredMessage.IndexOf("NTE") > -1, "Returned Message added ORC segment.");
        }
예제 #19
0
        public void ParseORDERGroupRepetitionsIn_OML_O33()
        {
            const string twoTestOrderMessage =
                "MSH|^~\\&|||||20210921154451+1000||OML^O33^OML_O33|20210921154451|P|2.5.1|||NE|AL||UNICODE UTF-8|||LAB-28^IHE\r"
                + "SPM|1|||SER^Serum^HL70487|||||||P^Patient^HL70369\r"
                + "SAC|||Found_TT1_TT2_SER_098\r"
                + "ORC|NW||||||||20210921154451\r"
                + "OBR|1|AWOS_ID_Found_TT1_TT2_SER_098_0||TT1^Test Type 1^99000\r"
                + "ORC|NW||||||||20210921154451\r"
                + "OBR|2|AWOS_ID_Found_TT1_TT2_SER_098_1||TT2^Test Type 2^99000";

            var parser = new PipeParser();
            var oml    = parser.Parse(twoTestOrderMessage, new ParserOptions {
                NonGreedyMode = true
            }) as OML_O33;

            Assert.NotNull(oml);

            var specimen = oml.SPECIMENs.ElementAt(0);

            Assert.AreEqual(2, specimen.ORDERRepetitionsUsed);

            var firstOrder = specimen.ORDERs.ElementAt(0);
            var firstObr   = firstOrder.OBSERVATION_REQUEST.OBR.UniversalServiceIdentifier;

            Assert.AreEqual("TT1", firstObr.Identifier.Value);

            var secondOrder = specimen.ORDERs.ElementAt(1);
            var secondObr   = secondOrder.OBSERVATION_REQUEST.OBR.UniversalServiceIdentifier;

            Assert.AreEqual("TT2", secondObr.Identifier.Value);
        }
예제 #20
0
        public void CreateBlankMessage()
        {
            ADT_A01  a01       = new ADT_A01();
            DateTime birthDate = new DateTime(1980, 4, 1);

            a01.MSH.SendingApplication.UniversalID.Value   = "ThisOne";
            a01.MSH.ReceivingApplication.UniversalID.Value = "COHIE";
            a01.PID.PatientIDExternalID.ID.Value           = "123456";
            a01.PV1.GetAttendingDoctor(0).FamilyName.Value = "Jones";
            a01.PV1.GetAttendingDoctor(0).GivenName.Value  = "Mike";
            a01.PID.DateOfBirth.TimeOfAnEvent.SetShortDate(birthDate);

            PipeParser parser = new PipeParser();

            string pipeMessage = parser.Encode(a01);

            Assert.IsNotNull(pipeMessage);

            IMessage test    = parser.Parse(pipeMessage);
            ADT_A01  a01Test = test as ADT_A01;

            Assert.IsNotNull(a01Test);

            Assert.AreEqual(a01Test.MSH.ReceivingApplication.UniversalID.Value, "COHIE");
            Assert.AreEqual(a01Test.PID.PatientIDExternalID.ID.Value, "123456");

            Assert.AreEqual(a01Test.PID.DateOfBirth.TimeOfAnEvent.GetAsDate().ToShortDateString(), birthDate.ToShortDateString());

            Assert.AreEqual(a01Test.PV1.GetAttendingDoctor(0).FamilyName.Value, "Jones");
            Assert.AreEqual(a01Test.MSH.MessageType.MessageType.Value, "ADT");
            Assert.AreEqual(a01Test.MSH.MessageType.TriggerEvent.Value, "A01");
        }
예제 #21
0
        public void TestSpecialCharacterEntryWithAllSpecialCharacters()
        {
            PipeParser parser = new PipeParser();
            ORU_R01    oru    = new ORU_R01();

            oru.MSH.MessageType.MessageType.Value  = "ORU";
            oru.MSH.MessageType.TriggerEvent.Value = "R01";
            oru.MSH.EncodingCharacters.Value       = @"^~\&";
            oru.MSH.VersionID.VersionID.Value      = "2.3.1";
            oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.ValueType.Value = "FT";
            oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).OBR.SetIDOBR.Value = "1";
            NHapi.Base.Model.Varies v = oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.GetObservationValue(0);
            ST text = new ST(oru);

            text.Value = @"Th&is\.br\is\.br\A T|e\H\st\";
            v.Data     = text;


            string encodedData = parser.Encode(oru);

            Console.WriteLine(encodedData);
            NHapi.Base.Model.IMessage msg = parser.Parse(encodedData);
            oru = (ORU_R01)msg;
            FT data = (FT)oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.GetObservationValue(0).Data;

            Assert.AreEqual(@"Th&is\.br\is\.br\A T|e\H\st\", data.Value);
        }
예제 #22
0
        public void Test_281DataTypesParseCorrectly(string message)
        {
            var parser = new PipeParser();
            var oru    = new ORU_R01();

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

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

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

            int 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);
        }
예제 #23
0
        public void Obx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultOptionIsSet_DefaultTypeIsUsed()
        {
            var message =
                "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.3|||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||||STValue||||||F\r";

            var expectedEncodedMessage =
                "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.3|||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|ST|||STValue||||||F\r";

            var parser  = new PipeParser();
            var options = new ParserOptions {
                DefaultObx2Type = "ST"
            };

            var parsed         = parser.Parse(message, options);
            var encodedMessage = parser.Encode(parsed);

            Assert.AreEqual(expectedEncodedMessage, encodedMessage);
        }
예제 #24
0
        public void ParseORMwithCompleteOBXToXML()
        {
            string Message = @"MSH|^~\&|INVISION|DHC|SUNQUEST LAB||200606191615||ORM^O01|ORDR|P|2.3.1|LAB
PID|0001||3020956||TRAINONLYPOE^ONE||19770903|F||W||||||||40230443
PV1|0001|I|MICU^W276^01||||045716^ABAZA, MONA M|||MED|||||||045716|F|000000030188
ORC|NW|01444^00001|||||||||||L
OBR||01444^00001||CAI^CALCIUM IONIZED|||200606191614||||L|||||045716^STEELE, ANDREW W|||||||||||00001&UNITS^ONCE&ONCE^000^200606191614^200606191614^ROUTINE
OBX|1|TX|SDES||Blood, peripheral||||||Z
OBX|2|TX|SREQ||LEFT ANTECUBITAL||||||Z
OBX|3|TX|CULT||Beta hemolytic Streptococcus Group A||||||Z
OBX|4|TX|CULT||Critical result(s) called to and verification ";

            Message += "\"read-back\"";
            Message += @" received from: Nu~||||||Z
";

            PipeParser Parser = new PipeParser();

            IMessage m = Parser.Parse(Message);

            ORM_O01 msgObj = m as ORM_O01;

            Assert.IsNotNull(msgObj);

            XMLParser xmlParser = new DefaultXMLParser();

            string recoveredMessage = xmlParser.Encode(msgObj);

            Assert.IsNotNull(recoveredMessage);
            Assert.IsFalse(string.Empty.Equals(recoveredMessage));
        }
예제 #25
0
        public void TestUnexpectedSegmentHintsDropToRoot()
        {
            var message =
                "MSH|^~\\&|DATASERVICES|CORPORATE|||20120711120510.2-0500||ADT^A01^ADT_A01|9c906177-dfca-4bbe-9abd-d8eb43df93a0|D|2.6\r"
                + "ZZA|1\r"
                + "EVN||20120701000000-0500\r"
                + "PID|1||397979797^^^SN^SN~4242^^^BKDMDM^PI~1000^^^YARDI^PI||Williams^Rory^H^^^^A||19641028000000-0600|M||||||||||31592^^^YARDI^AN\r"
                + "NK1|1|Pond^Amelia^Q^^^^A|SPO|1234 Main St^^Sussex^WI^53089|^PRS^CP^^^^^^^^^555-1212||N\r"
                + "NK1|2|Smith^John^^^^^A~^The Doctor^^^^^A|FND|1234 S Water St^^New London^WI^54961||^WPN^PH^^^^^^^^^555-9999|C\r"
                + "PV1|2|I||R\r"
                + "GT1|1||Doe^John^A^^^^A||5678 Maple Ave^^Sussex^WI^53089|^PRS^PH^^^^^^^^^555-9999|||||OTH\r"
                + "IN1|1|CAP1000|YYDN|ACME HealthCare||||GR0000001|||||||HMO|||||||||||||||||||||PCY-0000042\r"
                + "IN1|2||||||||||||||Medicare|||||||||||||||||||||123-45-6789-A\r"
                + "IN1|3||||||||||||||Medicaid|||||||||||||||||||||987654321L\r"
                + "ZFA|6|31592|12345|YARDI|20120201000000-0600";

            var parser  = new PipeParser();
            var options = new ParserOptions {
                UnexpectedSegmentBehaviour = UnexpectedSegmentBehaviour.DropToRoot
            };

            var msg = (NHapi.Model.V26.Message.ADT_A01)parser.Parse(message, options);

            var zzas = msg.GetAll("ZZA");
            var zfas = msg.GetAll("ZFA");

            Assert.AreEqual(1, zfas.Length);
            Assert.AreEqual(1, zzas.Length);
        }
예제 #26
0
        public void ParseORRo02ToXml()
        {
            string Message = @"MSH|^~\&|INVISION|DHC|SUNQUEST LAB||200607100719||ORR^O02|ORDR|T|2.3.1|LAB
PID|0001||3017864||HILBERT^MARY||19440823|F||W||||||||40244246
PV1|0001|O|LW||||888883^DOCTOR, UNASSIGNED||||||||||888883|O|000000031540
ORC|NA|00003^00001|F1492|||||||||888883
OBR||00003^00001|F1492|RESPC^CULTURE RESPIRATORY ROUTINE|||||||L|||||||||F1492|||||||^ONCE&ONCE^^200607070600^200607070600^ROUTINE
";

            PipeParser Parser = new PipeParser();

            IMessage m = Parser.Parse(Message);

            ORR_O02 msg = m as ORR_O02;

            XMLParser xmlParser = new DefaultXMLParser();

            string recoveredMessage = xmlParser.Encode(msg);

            Assert.AreNotEqual(string.Empty, recoveredMessage);

            XmlDocument orrDoc = new XmlDocument();

            orrDoc.LoadXml(recoveredMessage);
            Assert.IsNotNull(orrDoc);
        }
예제 #27
0
        private static void TestParserConfigurableContext()
        {
            if (messages.Count > 0)
            {
                Console.WriteLine("\n==============================================\nTesting parsing with configurable context.");
                PipeParser          parser  = new PipeParser();
                ConfigurableContext context = new ConfigurableContext(parser.ValidationContext);
                parser.ValidationContext = context;

                Console.WriteLine("Encodingrules added:\t  {0}", context.EncodingRuleCount);
                Console.WriteLine("Messagerules added:\t  {0}", context.MessageRuleCount);
                Console.WriteLine("PrimitiveTyperules added: {0}", context.PrimitiveRuleCount);
                Console.WriteLine();

                int count = 0;
                foreach (string m in messages)
                {
                    IMessage im = parser.Parse(m);
                    parsedMessages.Add(im);

                    string structure = im.GetStructureName();
                    Console.WriteLine("Parsed {0}, V{1}.", structure, im.Version);
                    count++;
                }
                Console.WriteLine("\nDone! (Parsed {0})", count);
            }
        }
예제 #28
0
        public void TestOBXDataTypes()
        {
            string message = @"MSH|^~\&|EPIC|AIDI|||20070921152053|ITFCOHIEIN|ORF^R04^ORF_R04|297|P|2.4|||
MSA|CA|1
QRD|20060725141358|R|||||10^RD|1130851^^^^MRN|RES|||
QRF|||||||||
OBR|1|5149916^EPC|20050118113415533318^|E8600^ECG^^^ECG|||200501181134||||||Age: 17  yrs ~Criteria: C-HP708 ~|||||1||Zztesttwocorhoi|Results||||F||^^^^^Routine|||||||||200501181134|||||||||
OBX|1|ST|:8601-7^ECG IMPRESSION|2|Normal sinus rhythm, rate  77     Normal P axis, PR, rate & rhythm ||||||F||1|200501181134||
OBX|2|ST|:8625-6^PR INTERVAL|3|141||||||F||1|200501181134||
OBX|3|ST|:8633-0^QRS DURATION|4|83||||||F||1|200501181134||
OBX|4|ST|:8634-8^QT INTERVAL|5|358||||||F||1|200501181134||
OBX|5|ST|:8636-3^QT INTERVAL CORRECTED|6|405||||||F||1|200501181134||
OBX|6|ST|:8626-4^FRONTAL AXIS P|7|-1||||||F||1|200501181134||
OBX|7|ST|:99003^FRONTAL AXIS INITIAL 40 MS|8|41||||||F||1|200501181134||
OBX|8|ST|:8632-2^FRONTAL AXIS MEAN QRS|9|66||||||F||1|200501181134||
OBX|9|ST|:99004^FRONTAL AXIS TERMINAL 40 MS|10|80||||||F||1|200501181134||
OBX|10|ST|:99005^FRONTAL AXIS ST|11|36||||||F||1|200501181134||
OBX|11|ST|:8638-9^FRONTAL AXIS T|12|40||||||F||1|200501181134||
OBX|12|ST|:99006^ECG SEVERITY T|13|- NORMAL ECG - ||||||F||1|200501181134||
OBX|13|DT|5315037^Start Date^Start Collection Dat^ABC||18APR06||||||F|||20060419125100|PPKMG|PPJW^SMITH, Fred 
QAK||OK||1|1|0
";

            PipeParser parser = new PipeParser();

            IMessage m = parser.Parse(message);

            ORF_R04 orfR04 = m as ORF_R04;

            Assert.IsNotNull(orfR04);

            XMLParser xmlParser = new DefaultXMLParser();

            string recoveredMessage = xmlParser.Encode(orfR04);
        }
예제 #29
0
        public void UnEscapesData()
        {
            // Arrange
            const string content = "MSH|^~\\&|TestSys|432^testsys practice|TEST||201402171537||MDM^T02|121906|P|2.3.1||||||||\r"
                                   + "OBX|1|TX|PROBLEM FOCUSED^PROBLEM FOCUSED^test|1|\\T\\#39;Thirty days have September,\\X0D\\April\\X0A\\June,\\X0A\\and November.\\X0A\\When short February is done,\\E\\X0A\\E\\all the rest have\\T\\nbsp;31.\\T\\#39";

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

            // Act
            var segment     = msg.GetStructure("OBX") as ISegment;
            var idx         = Terser.GetIndices("OBX-5");
            var segmentData = Terser.Get(segment, idx[0], idx[1], idx[2], idx[3]);

            // Assert

            // verify that data was properly un-escaped by NHapi
            // \E\X0A\E\ should be escaped to \X0A\
            // \X0A\ should be un-escaped to \n - this is configurable
            // \X0D\ should be un-escaped to \r - this is configurable
            // \t\ should be un-escaped to &
            const string expectedResult =
                "&#39;Thirty days have September,\rApril\nJune,\nand November.\nWhen short February is done,\\X0A\\all the rest have&nbsp;31.&#39";

            Assert.AreEqual(expectedResult, segmentData);
        }
예제 #30
0
        public void ParseORFR04ToXML()
        {
            string message =
                @"MSH|^~\&|Query Result Locator|Query Facility Name|Query Application Name|ST ELSEWHERE HOSPITAL|20051024074506||ORF^R04|432|P|2.4|
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);

            XMLParser xmlParser = new DefaultXMLParser();

            string recoveredMessage = xmlParser.Encode(orfR04);

            Assert.IsNotNull(recoveredMessage);
            Assert.IsFalse(string.Empty.Equals(recoveredMessage));
        }
예제 #31
0
        public void TestSpecialCharacterEntryEndingSlash()
        {
            var parser = new PipeParser();
            var oru    = new ORU_R01();

            oru.MSH.MessageType.MessageType.Value  = "ORU";
            oru.MSH.MessageType.TriggerEvent.Value = "R01";
            oru.MSH.EncodingCharacters.Value       = @"^~\&";
            oru.MSH.VersionID.VersionID.Value      = "2.3.1";
            oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.ValueType.Value = "FT";
            oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).OBR.SetIDOBR.Value = "1";
            var v =
                oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.GetObservationValue(0);
            var text = new ST(oru);

            text.Value = @"This\.br\is\.br\A Test~";
            v.Data     = text;

            var encodedData = parser.Encode(oru);
            var msg         = parser.Parse(encodedData);

            oru = (ORU_R01)msg;
            var data = (FT)oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.GetObservationValue(0).Data;

            Assert.AreEqual(@"This\.br\is\.br\A Test~", data.Value);
        }