- MDHL7BH ; HOIFO/WAA,WOIFO/PMK -Bi-directional interface (HL7) routine ;15 Jun 2018 12:46 PM
- ;;1.0;CLINICAL PROCEDURES;**11,21,20,60**;Apr 01, 2004;Build 1
- ;
- ; This routine will build the HL7 Message and store that message.
- ; After the message has been created then it will call the
- ; The actual HL7package to start the processing of the message
- ;
- ; Reference DBIA #2056 [Supported] reference $$GET1^DIQ function call
- ; Reference DBIA #2161 [Supported] call to INIT^HLFCN2
- ; Reference DBIA #2164 [Supported] call to GENERATE^HLMA
- ; Reference DBIA #6932 [Private] call to CLINPROC^MAGDHLWP
- ; Reference DBIA #10061 [Supported] call to ADD^VADPT
- ; Reference DBIA #10103 [Supported] calls to $$NOW^XLFDT
- ; Reference DBIA #3062 [Supported] calls to $$HLNAME^XLFNAME
- ; Reference DBIA #2263 [Supported] calls to $$GET^XPAR
- ; Reference DBIA #3067 [Private] Read Consult Data with FM call.
- ; Reference DBIA #10035[Supported] Patient File Access
- ; Reference DBIA #10040[Supported] Access ^SC
- ; Reference DBIA #10056[Supported] Direct read STATE (5)
- Q
- EN1 ;Main Entry point.
- N MDMSG,MD101,CNT,HLA,LINE,MDHL,DFN,MDLINK
- Q:RESULT<1 ; This tells the study is not a BDi
- S MDLINK=$$GET1^DIQ(702.09,DEVIEN,.18,"E")
- I MDLINK="" S RESULT=-1,MSG="No HL Logical Link has been defined." Q ; No link has been defined
- S MDERROR="0"
- D INIT^HLFNC2("MCAR ORM SERVER",.MDMSG)
- I +$G(MDMSG)>0 S RESULT=-1,MSG="Unable to produce a message." Q ; something is wrong and no MSH was created
- S DFN=$$GET1^DIQ(702,MDD702,.01,"I")
- S DEVNAME=$$GET1^DIQ(702.09,DEVIEN,.16,"I")
- S CNT=0
- D PID S CNT=CNT+1,HLA("HLS",CNT)=LINE
- D PV1 S CNT=CNT+1,HLA("HLS",CNT)=LINE
- D ORC S CNT=CNT+1,HLA("HLS",CNT)=LINE
- D OBR I LINE'="" S CNT=CNT+1,HLA("HLS",CNT)=LINE
- S HLP("SUBSCRIBER")="^^VISTA^^"_DEVNAME_"^M"
- S HLL("LINKS",1)="MCAR ORM CLIENT"_"^"_MDLINK
- ;
- ; MD*1.0*60 - 16 April 2018 - Peter Kuzmak, VistA Imaging
- ; VistA Imaging code to generate CPRS Consult Request Tracking
- ; HL7 message for the DICOM Text Gateway to put the CP study
- ; on the DICOM Modality Worklist. This usually happens when
- ; the study is ordered, but is deferred for CP to check-in time.
- ;
- ; This considerably improves interoperability between Clinical Procedure
- ; and VistA Imaging CPRS Consult Request Tracking DICOM.
- ;
- ; If the CP - DICOM INTEROPERABILITY (field #.19) of the CP Instrument
- ; file (#702.09) is set to 2, then the VistA Imaging HL7 will replace
- ; the just-created CP HL7 in HLA("HLS"). The benefit for this is the
- ; VistA Imaging HL7 has much more data than does the CP HL7. The VistA
- ; Imaging HL7 would be transmitted to the instrument identically the same
- ; as the CP HL7, using the 1.6 HL7 package software (i.e., not HLO).
- ;
- I $T(CLINPROC^MAGDHOWP)'="" D CLINPROC^MAGDHOWP(MDD702,MDORFLG) ; invoke VistA Imaging to generate HL7
- ;
- D GENERATE^HLMA("MCAR ORM SERVER","LM",1,.MDHL,,.HLP)
- I $P(MDHL,U,2) S MDERROR=MDHL
- Q
- OBR ; Send the procedure to the correct device
- S LINE="OBR|"
- S DEVIEN=$$GET1^DIQ(702,MDD702,.11,"I")
- S USC=$$GET1^DIQ(702.09,DEVIEN,.17,"I")
- I USC="" S LINE="" Q
- E S USC=$TR(USC,"=","^")
- S $P(LINE,"|",5)=USC_"|"
- Q
- PID ;get the patient information and build the PID
- ;PID|||SSN||Last^First||DOB|SEX|||||||||||SSN
- N MDSSN,NAME,DOB,ADDR,TMP,MDADD,VAPA,VAERR,VAROOT,MDPCOD
- S LINE="PID|",$P(LINE,"|",21)=""
- S MDSSN=$$GET1^DIQ(702,MDD702,.011) ; Get the ssn for the patient
- S NAME=$$GET1^DIQ(702,MDD702,.01,"E") ; get the patient name
- S NAME=$$HLNAME^XLFNAME($P(NAME,"^"),"",$E(HLECH,1))
- I $P(NAME,$E(HLECH,1),7)'="L" S $P(NAME,$E(HLECH,1),7)="L"
- S DOB=$$GET1^DIQ(2,DFN,.03,"I") S DOB=$$FTOHL7^MDHL7U2(DOB)
- S VAROOT="MDADD" D ADD^VADPT
- S ADDR=$G(MDADD(1))_"^" ; Address 1
- S TMP=$G(MDADD(2)) I TMP'="" S ADDR=ADDR_TMP ; Add 2
- S TMP=$G(MDADD(3)) I TMP'="" S ADDR=ADDR_" "_TMP ; Add 3
- S ADDR=ADDR_"^"_$G(MDADD(4)) ; City
- S MDPCOD=$P($G(MDADD(5)),"^",1) I MDPCOD'="" S MDPCOD=$P($G(^DIC(5,MDPCOD,0)),"^",2)
- ; ^^^^^^ Setting MDPCODE to Postal code Via direct supported lookup.
- S ADDR=ADDR_"^"_MDPCOD ; State Postal Code
- S ADDR=ADDR_"^"_$G(MDADD(6)) ; Zip
- K MDADD
- S $P(LINE,"|",2)="1"
- S $P(LINE,"|",4)=MDSSN
- S $P(LINE,"|",6)=NAME
- S $P(LINE,"|",8)=DOB
- S $P(LINE,"|",9)=$$GET1^DIQ(2,DFN,.02,"I")
- S $P(LINE,"|",12)=ADDR
- S $P(LINE,"|",20)=MDSSN
- Q
- PV1 ;Get the ward location for PV1
- ;PV1||In or out|Ward location
- N CWARD,WARD,INOUT,CONSULT,REF,NREF,WARD1,WARD2,MDPR1,MDPNAM,MDSV
- S WARD=$$GET1^DIQ(2,DFN,.1,"E"),(WARD1,WARD2)=""
- S INOUT=$S(WARD'="":"I",1:"O")
- S:WARD'="" WARD=WARD_U_WARD
- S CONSULT=$$GET123^MDHL7U2(MDD702)
- S CWARD=$P($G(^MDD(702,+MDD702,0)),U,7),CWARD=$P(CWARD,";",3)
- S:+CWARD WARD2=$$GET1^DIQ(44,+CWARD_",",.01,"E")
- S MDPR1=$$GET1^DIQ(702,+MDD702_",",.04,"I")
- S:+MDPR1 WARD1=$$GET1^DIQ(702.01,+MDPR1_",",.05,"E")
- S MDPNAM=$$GET1^DIQ(702.09,DEVIEN,.06,"I")
- I INOUT="O" D
- .;S WARD=WARD1 S:WARD="" WARD=WARD2
- .S WARD=WARD2 S:WARD="" WARD=WARD1
- .I WARD="" S WARD=$$GET1^DIQ(123,CONSULT_",",.04,"E"),MDSV="A;"_$$NOW^XLFDT()_";"_$$GET1^DIQ(123,CONSULT_",",.04,"I"),$P(^MDD(702,+MDD702,0),U,7)=MDSV
- .I MDPNAM["Olympus" D
- ..S WARD1=$O(^SC("B",WARD,0)),CWARD=$P($G(^SC(+WARD1,0)),U,2)
- ..S WARD=$S(+$$GET^XPAR("SYS","MD OLYMPUS 7",1)>0:$E(WARD,1,7),1:$E(WARD,1,4))_"^"_CWARD
- I INOUT="I" D
- .S:WARD="" WARD=WARD2 S:WARD="" WARD=WARD1
- .S:WARD="" WARD=$$GET1^DIQ(123,CONSULT_",",.04,"E")
- .S WARD=WARD_"^"_$S($G(^DPT(2,.101))'="":$G(^DPT(2,.101)),1:"") Q
- ;V--- NEW CODE THis code is
- I $P($P(^MDD(702,+MDD702,0),U,7),";",3)="" D
- . I +MDPR1 Q:+$$GET1^DIQ(702.01,+MDPR1_",",.05,"I")
- . S MDSV="A;"_$$NOW^XLFDT()_";"_$$GET1^DIQ(123,CONSULT_",",.04,"I"),$P(^MDD(702,+MDD702,0),U,7)=MDSV
- . Q
- ;^--- NEW CODE
- S LINE="PV1||"_INOUT_"|"_WARD
- Q:CONSULT<1
- S NREF=$$GETREF^MDHL7U2(CONSULT) Q:NREF="-1"
- S $P(LINE,"|",9)=NREF
- Q
- ORC ;get ORC onformation
- ;ORC|NA|Order Number|||||||date/time ordered
- N DATE,SDATE
- S DATE=$$GET1^DIQ(702,MDD702,.02,"I")
- S DATE=$$FTOHL7^MDHL7U2(DATE)
- S SDATE=$$GET1^DIQ(702,MDD702,.07,"I")
- I SDATE[";" S SDATE=$P(SDATE,";",2)
- I SDATE="" D NOW^%DTC S SDATE=% S $P(^MDD(702,MDD702,0),"^",7)=SDATE
- I SDATE<DT D NOW^%DTC S SDATE=%
- S SDATE=$$FTOHL7^MDHL7U2(SDATE)
- S LINE="ORC|"_$S(MDORFLG=1:"NW",MDORFLG=0:"CA",1:"")_"|"_MDIORD
- S $P(LINE,"|",6)=$S(MDORFLG=1:"NW",MDORFLG=0:"CA",1:"")
- S $P(LINE,"|",10)=DATE,$P(LINE,"|",16)=SDATE
- Q
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HMDHL7BH 6465 printed Feb 18, 2025@23:09:08 Page 2
- MDHL7BH ; HOIFO/WAA,WOIFO/PMK -Bi-directional interface (HL7) routine ;15 Jun 2018 12:46 PM
- +1 ;;1.0;CLINICAL PROCEDURES;**11,21,20,60**;Apr 01, 2004;Build 1
- +2 ;
- +3 ; This routine will build the HL7 Message and store that message.
- +4 ; After the message has been created then it will call the
- +5 ; The actual HL7package to start the processing of the message
- +6 ;
- +7 ; Reference DBIA #2056 [Supported] reference $$GET1^DIQ function call
- +8 ; Reference DBIA #2161 [Supported] call to INIT^HLFCN2
- +9 ; Reference DBIA #2164 [Supported] call to GENERATE^HLMA
- +10 ; Reference DBIA #6932 [Private] call to CLINPROC^MAGDHLWP
- +11 ; Reference DBIA #10061 [Supported] call to ADD^VADPT
- +12 ; Reference DBIA #10103 [Supported] calls to $$NOW^XLFDT
- +13 ; Reference DBIA #3062 [Supported] calls to $$HLNAME^XLFNAME
- +14 ; Reference DBIA #2263 [Supported] calls to $$GET^XPAR
- +15 ; Reference DBIA #3067 [Private] Read Consult Data with FM call.
- +16 ; Reference DBIA #10035[Supported] Patient File Access
- +17 ; Reference DBIA #10040[Supported] Access ^SC
- +18 ; Reference DBIA #10056[Supported] Direct read STATE (5)
- +19 QUIT
- EN1 ;Main Entry point.
- +1 NEW MDMSG,MD101,CNT,HLA,LINE,MDHL,DFN,MDLINK
- +2 ; This tells the study is not a BDi
- if RESULT<1
- QUIT
- +3 SET MDLINK=$$GET1^DIQ(702.09,DEVIEN,.18,"E")
- +4 ; No link has been defined
- IF MDLINK=""
- SET RESULT=-1
- SET MSG="No HL Logical Link has been defined."
- QUIT
- +5 SET MDERROR="0"
- +6 DO INIT^HLFNC2("MCAR ORM SERVER",.MDMSG)
- +7 ; something is wrong and no MSH was created
- IF +$GET(MDMSG)>0
- SET RESULT=-1
- SET MSG="Unable to produce a message."
- QUIT
- +8 SET DFN=$$GET1^DIQ(702,MDD702,.01,"I")
- +9 SET DEVNAME=$$GET1^DIQ(702.09,DEVIEN,.16,"I")
- +10 SET CNT=0
- +11 DO PID
- SET CNT=CNT+1
- SET HLA("HLS",CNT)=LINE
- +12 DO PV1
- SET CNT=CNT+1
- SET HLA("HLS",CNT)=LINE
- +13 DO ORC
- SET CNT=CNT+1
- SET HLA("HLS",CNT)=LINE
- +14 DO OBR
- IF LINE'=""
- SET CNT=CNT+1
- SET HLA("HLS",CNT)=LINE
- +15 SET HLP("SUBSCRIBER")="^^VISTA^^"_DEVNAME_"^M"
- +16 SET HLL("LINKS",1)="MCAR ORM CLIENT"_"^"_MDLINK
- +17 ;
- +18 ; MD*1.0*60 - 16 April 2018 - Peter Kuzmak, VistA Imaging
- +19 ; VistA Imaging code to generate CPRS Consult Request Tracking
- +20 ; HL7 message for the DICOM Text Gateway to put the CP study
- +21 ; on the DICOM Modality Worklist. This usually happens when
- +22 ; the study is ordered, but is deferred for CP to check-in time.
- +23 ;
- +24 ; This considerably improves interoperability between Clinical Procedure
- +25 ; and VistA Imaging CPRS Consult Request Tracking DICOM.
- +26 ;
- +27 ; If the CP - DICOM INTEROPERABILITY (field #.19) of the CP Instrument
- +28 ; file (#702.09) is set to 2, then the VistA Imaging HL7 will replace
- +29 ; the just-created CP HL7 in HLA("HLS"). The benefit for this is the
- +30 ; VistA Imaging HL7 has much more data than does the CP HL7. The VistA
- +31 ; Imaging HL7 would be transmitted to the instrument identically the same
- +32 ; as the CP HL7, using the 1.6 HL7 package software (i.e., not HLO).
- +33 ;
- +34 ; invoke VistA Imaging to generate HL7
- IF $TEXT(CLINPROC^MAGDHOWP)'=""
- DO CLINPROC^MAGDHOWP(MDD702,MDORFLG)
- +35 ;
- +36 DO GENERATE^HLMA("MCAR ORM SERVER","LM",1,.MDHL,,.HLP)
- +37 IF $PIECE(MDHL,U,2)
- SET MDERROR=MDHL
- +38 QUIT
- OBR ; Send the procedure to the correct device
- +1 SET LINE="OBR|"
- +2 SET DEVIEN=$$GET1^DIQ(702,MDD702,.11,"I")
- +3 SET USC=$$GET1^DIQ(702.09,DEVIEN,.17,"I")
- +4 IF USC=""
- SET LINE=""
- QUIT
- +5 IF '$TEST
- SET USC=$TRANSLATE(USC,"=","^")
- +6 SET $PIECE(LINE,"|",5)=USC_"|"
- +7 QUIT
- PID ;get the patient information and build the PID
- +1 ;PID|||SSN||Last^First||DOB|SEX|||||||||||SSN
- +2 NEW MDSSN,NAME,DOB,ADDR,TMP,MDADD,VAPA,VAERR,VAROOT,MDPCOD
- +3 SET LINE="PID|"
- SET $PIECE(LINE,"|",21)=""
- +4 ; Get the ssn for the patient
- SET MDSSN=$$GET1^DIQ(702,MDD702,.011)
- +5 ; get the patient name
- SET NAME=$$GET1^DIQ(702,MDD702,.01,"E")
- +6 SET NAME=$$HLNAME^XLFNAME($PIECE(NAME,"^"),"",$EXTRACT(HLECH,1))
- +7 IF $PIECE(NAME,$EXTRACT(HLECH,1),7)'="L"
- SET $PIECE(NAME,$EXTRACT(HLECH,1),7)="L"
- +8 SET DOB=$$GET1^DIQ(2,DFN,.03,"I")
- SET DOB=$$FTOHL7^MDHL7U2(DOB)
- +9 SET VAROOT="MDADD"
- DO ADD^VADPT
- +10 ; Address 1
- SET ADDR=$GET(MDADD(1))_"^"
- +11 ; Add 2
- SET TMP=$GET(MDADD(2))
- IF TMP'=""
- SET ADDR=ADDR_TMP
- +12 ; Add 3
- SET TMP=$GET(MDADD(3))
- IF TMP'=""
- SET ADDR=ADDR_" "_TMP
- +13 ; City
- SET ADDR=ADDR_"^"_$GET(MDADD(4))
- +14 SET MDPCOD=$PIECE($GET(MDADD(5)),"^",1)
- IF MDPCOD'=""
- SET MDPCOD=$PIECE($GET(^DIC(5,MDPCOD,0)),"^",2)
- +15 ; ^^^^^^ Setting MDPCODE to Postal code Via direct supported lookup.
- +16 ; State Postal Code
- SET ADDR=ADDR_"^"_MDPCOD
- +17 ; Zip
- SET ADDR=ADDR_"^"_$GET(MDADD(6))
- +18 KILL MDADD
- +19 SET $PIECE(LINE,"|",2)="1"
- +20 SET $PIECE(LINE,"|",4)=MDSSN
- +21 SET $PIECE(LINE,"|",6)=NAME
- +22 SET $PIECE(LINE,"|",8)=DOB
- +23 SET $PIECE(LINE,"|",9)=$$GET1^DIQ(2,DFN,.02,"I")
- +24 SET $PIECE(LINE,"|",12)=ADDR
- +25 SET $PIECE(LINE,"|",20)=MDSSN
- +26 QUIT
- PV1 ;Get the ward location for PV1
- +1 ;PV1||In or out|Ward location
- +2 NEW CWARD,WARD,INOUT,CONSULT,REF,NREF,WARD1,WARD2,MDPR1,MDPNAM,MDSV
- +3 SET WARD=$$GET1^DIQ(2,DFN,.1,"E")
- SET (WARD1,WARD2)=""
- +4 SET INOUT=$SELECT(WARD'="":"I",1:"O")
- +5 if WARD'=""
- SET WARD=WARD_U_WARD
- +6 SET CONSULT=$$GET123^MDHL7U2(MDD702)
- +7 SET CWARD=$PIECE($GET(^MDD(702,+MDD702,0)),U,7)
- SET CWARD=$PIECE(CWARD,";",3)
- +8 if +CWARD
- SET WARD2=$$GET1^DIQ(44,+CWARD_",",.01,"E")
- +9 SET MDPR1=$$GET1^DIQ(702,+MDD702_",",.04,"I")
- +10 if +MDPR1
- SET WARD1=$$GET1^DIQ(702.01,+MDPR1_",",.05,"E")
- +11 SET MDPNAM=$$GET1^DIQ(702.09,DEVIEN,.06,"I")
- +12 IF INOUT="O"
- Begin DoDot:1
- +13 ;S WARD=WARD1 S:WARD="" WARD=WARD2
- +14 SET WARD=WARD2
- if WARD=""
- SET WARD=WARD1
- +15 IF WARD=""
- SET WARD=$$GET1^DIQ(123,CONSULT_",",.04,"E")
- SET MDSV="A;"_$$NOW^XLFDT()_";"_$$GET1^DIQ(123,CONSULT_",",.04,"I")
- SET $PIECE(^MDD(702,+MDD702,0),U,7)=MDSV
- +16 IF MDPNAM["Olympus"
- Begin DoDot:2
- +17 SET WARD1=$ORDER(^SC("B",WARD,0))
- SET CWARD=$PIECE($GET(^SC(+WARD1,0)),U,2)
- +18 SET WARD=$SELECT(+$$GET^XPAR("SYS","MD OLYMPUS 7",1)>0:$EXTRACT(WARD,1,7),1:$EXTRACT(WARD,1,4))_"^"_CWARD
- End DoDot:2
- End DoDot:1
- +19 IF INOUT="I"
- Begin DoDot:1
- +20 if WARD=""
- SET WARD=WARD2
- if WARD=""
- SET WARD=WARD1
- +21 if WARD=""
- SET WARD=$$GET1^DIQ(123,CONSULT_",",.04,"E")
- +22 SET WARD=WARD_"^"_$SELECT($GET(^DPT(2,.101))'="":$GET(^DPT(2,.101)),1:"")
- QUIT
- End DoDot:1
- +23 ;V--- NEW CODE THis code is
- +24 IF $PIECE($PIECE(^MDD(702,+MDD702,0),U,7),";",3)=""
- Begin DoDot:1
- +25 IF +MDPR1
- if +$$GET1^DIQ(702.01,+MDPR1_",",.05,"I")
- QUIT
- +26 SET MDSV="A;"_$$NOW^XLFDT()_";"_$$GET1^DIQ(123,CONSULT_",",.04,"I")
- SET $PIECE(^MDD(702,+MDD702,0),U,7)=MDSV
- +27 QUIT
- End DoDot:1
- +28 ;^--- NEW CODE
- +29 SET LINE="PV1||"_INOUT_"|"_WARD
- +30 if CONSULT<1
- QUIT
- +31 SET NREF=$$GETREF^MDHL7U2(CONSULT)
- if NREF="-1"
- QUIT
- +32 SET $PIECE(LINE,"|",9)=NREF
- +33 QUIT
- ORC ;get ORC onformation
- +1 ;ORC|NA|Order Number|||||||date/time ordered
- +2 NEW DATE,SDATE
- +3 SET DATE=$$GET1^DIQ(702,MDD702,.02,"I")
- +4 SET DATE=$$FTOHL7^MDHL7U2(DATE)
- +5 SET SDATE=$$GET1^DIQ(702,MDD702,.07,"I")
- +6 IF SDATE[";"
- SET SDATE=$PIECE(SDATE,";",2)
- +7 IF SDATE=""
- DO NOW^%DTC
- SET SDATE=%
- SET $PIECE(^MDD(702,MDD702,0),"^",7)=SDATE
- +8 IF SDATE<DT
- DO NOW^%DTC
- SET SDATE=%
- +9 SET SDATE=$$FTOHL7^MDHL7U2(SDATE)
- +10 SET LINE="ORC|"_$SELECT(MDORFLG=1:"NW",MDORFLG=0:"CA",1:"")_"|"_MDIORD
- +11 SET $PIECE(LINE,"|",6)=$SELECT(MDORFLG=1:"NW",MDORFLG=0:"CA",1:"")
- +12 SET $PIECE(LINE,"|",10)=DATE
- SET $PIECE(LINE,"|",16)=SDATE
- +13 QUIT