| 1 | GMRCHL7 ;SLC/DCM,JFR - CONSULTS-->CPRS HL7 MESSAGING ; 10/15/02 15:23 
 | 
|---|
| 2 |  ;;3.0;CONSULT/REQUEST TRACKING;**1,5,12,19,29**;DEC 27, 1997
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ; This routine invokes IA #872,#2638,#2698
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 |  ;;Format the HL-7 Message header
 | 
|---|
| 7 |  Q
 | 
|---|
| 8 | INIT S HLQ=""""""
 | 
|---|
| 9 |  S SEP1="|",SEP2="^",SEP3="~",SEP4="\",SEP5="&"
 | 
|---|
| 10 |  Q
 | 
|---|
| 11 | MSH(X) ;Format MSH segment of HL-7 message.
 | 
|---|
| 12 |  ;FROM=GMRC CONSULTS - the sending application
 | 
|---|
| 13 |  N X
 | 
|---|
| 14 |  I '$D(HLQ) D INIT
 | 
|---|
| 15 |  S X="MSH|^~\&|CONSULTS|"_$S(+$G(DUZ(2)):DUZ(2),1:$$SITE^VASITE())_"|||||ORM"
 | 
|---|
| 16 |  Q X
 | 
|---|
| 17 | PID(GMRCIEN) ;Format the HL-7 PID segment
 | 
|---|
| 18 |  ;GMRCIEN=IEN of consult from File 123
 | 
|---|
| 19 |  N X
 | 
|---|
| 20 |  S GMRCDPT=$P(^GMR(123,GMRCIEN,0),"^",2)
 | 
|---|
| 21 |  S GMRCPTN=$P($G(^DPT(GMRCDPT,0)),"^")
 | 
|---|
| 22 |  S X="PID|||"_+GMRCDPT_"||"_GMRCPTN
 | 
|---|
| 23 |  K GMRCDPT,GMRCPTN
 | 
|---|
| 24 |  Q X
 | 
|---|
| 25 | PV1(GMRCIEN,RMBED,VISIT) ;Format the HL-7 PV1 segment
 | 
|---|
| 26 |  N GMRCSTS,SEP1,X,Y
 | 
|---|
| 27 |  S HOSPLOC=$P(^GMR(123,GMRCIEN,0),"^",4)
 | 
|---|
| 28 |  S VISIT=$$HL7DT(VISIT),GMRCSTS=$S($P(^GMR(123,GMRCIEN,0),"^",18)]"":$P(^(0),"^",18),HOSPLOC]"":"I",1:"O")
 | 
|---|
| 29 |  S X="PV1"_"||"_GMRCSTS_"|"_$S(HOSPLOC]"":HOSPLOC,1:"")_"^"_$S(RMBED]"":RMBED,1:"")_"|"_$S(VISIT]"":VISIT,1:"")
 | 
|---|
| 30 |  K Y,HOSPLOC,VISIT,GMRCSTS
 | 
|---|
| 31 |  Q X
 | 
|---|
| 32 | NTE(NTE,ND) ;Format the HL-7 NTE segment
 | 
|---|
| 33 |  Q:'$D(NTE)  Q:'$O(NTE(0))
 | 
|---|
| 34 |  S GMRCND=1,GMRCND1=0 D
 | 
|---|
| 35 |  .S GMRCND1=$O(NTE(GMRCND1)),@(MSG_"("_ND_")")=NTE(GMRCND1)
 | 
|---|
| 36 |  .F  S GMRCND1=$O(NTE(GMRCND1)) Q:GMRCND1=""  I NTE(GMRCND1)]"" S @(MSG_"("_ND_","_GMRCND_")")=NTE(GMRCND1),GMRCND=GMRCND+1
 | 
|---|
| 37 |  .Q
 | 
|---|
| 38 |  Q
 | 
|---|
| 39 | EN(PATID,GMRCIEN,GMRCRTYP,RMBED,ORCTRL,GMRCPLCR,VISIT,GMRCOM,GRPUPD,ACTDT) ;;Main entry point
 | 
|---|
| 40 |  ;PATID=DFN - Patients internal entry number from ^DPT(
 | 
|---|
| 41 |  ;GMRCIEN=IEN of consult, from File 123
 | 
|---|
| 42 |  ;RMBED=Hospital Room/Bed if patient is hospitalized
 | 
|---|
| 43 |  ;ORCTRL=Code from HL-7 table 119 (Appendix A) Order Control Codes
 | 
|---|
| 44 |  ;VISIT=Visit as a DATE/TIME in Fileman Format.
 | 
|---|
| 45 |  ;GMRCPROV=Provider - IEN from file 200
 | 
|---|
| 46 |  ;GMRCRTYP=consult type: GMRC REQUEST or GMRC CONSULT
 | 
|---|
| 47 |  ;GMRCPLCR=who is entering the order ; usually passed as DUZ for new order, "" for existing order
 | 
|---|
| 48 |  ;GMRCOM=comment array flag: 1 if there is comment array, 0 otherwise
 | 
|---|
| 49 |  ;GMRCOM(0)=DA of where comment is located: ^GMR(123,IEN,40,DA,
 | 
|---|
| 50 |  ;GRPUPD = group update of consults - sends nature as MAINTENANCE
 | 
|---|
| 51 |  ;ACTDT = date/time of activity if sent
 | 
|---|
| 52 |  Q:'$L(ORCTRL)
 | 
|---|
| 53 |  K GMRCMSS
 | 
|---|
| 54 |  N MSG,MSH,PID,PV1,ORC,NTE,OBR,OBX,ZSV,GMRCA,GMRCURGI,GMRCPLI
 | 
|---|
| 55 |  N GMRCPR,GMRCSS,GMRCTYPE,ORCPLCR
 | 
|---|
| 56 |  S MSH="",MSH=$$MSH(MSH)
 | 
|---|
| 57 |  S PID=$$PID(GMRCIEN)
 | 
|---|
| 58 |  I ORCTRL'="Z@" S PV1=$$PV1(GMRCIEN,RMBED,VISIT)
 | 
|---|
| 59 |  D ORC(GMRCIEN,ORCTRL,GMRCPLCR,$G(GRPUPD),$G(ACTDT))
 | 
|---|
| 60 |  S ORCTRL=$P(ORCTRL,U)
 | 
|---|
| 61 |  I ORCTRL="Z@" S ORC=$P(ORC,SEP1,1,4)
 | 
|---|
| 62 |  D:ORCTRL'="Z@" OBR^GMRCHL72(GMRCIEN,$G(GMRCAUTH),$G(ACTDT))
 | 
|---|
| 63 |  ;GMRCAUTH=principle results interpreter
 | 
|---|
| 64 |  D ZSV(GMRCIEN)
 | 
|---|
| 65 |  I $S(ORCTRL="SN":1,ORCTRL="RE":1,ORCTRL="XX":1,1:0) D OBX^GMRCHL72(GMRCIEN)
 | 
|---|
| 66 |  I $S(ORCTRL="OC":1,ORCTRL="OD":1,ORCTRL="XX":1,ORCTRL="SC":1,1:0),$G(GMRCOM(0)) D NTE^GMRCHL72(GMRCIEN,.GMRCOM,ORCTRL)
 | 
|---|
| 67 |  D BLD(MSH,PID,$G(PV1),$G(ORC),$G(OBR),$G(ZSV),.OBX,.NTE,ORCTRL)
 | 
|---|
| 68 |  ;M GMRCMSS=GMRCMSG ;HL-7 message debugging aid - remove from final version
 | 
|---|
| 69 |  D MSG^XQOR("GMRC EVSEND OR",.GMRCMSG)
 | 
|---|
| 70 |  K GMRCND,GMRCND1,GMRCMSG,GMRCNOD,GMRCORFN,GMRCPLI,GMRCPRI,HL7DT,HLQ,J,ND,ND1,ND2,NOTIFY,OBXND,OBXNO,ORCACT,ORCDT,ORURG,SEP1,SEP2,SEP3,SEP4,SEP5
 | 
|---|
| 71 |  Q
 | 
|---|
| 72 | BLD(MSH,PID,PV1,ORC,OBR,ZSV,OBX,NTE,CTRLCD) ;Build the HL-7 message global to pass to OR
 | 
|---|
| 73 |  S MSG="GMRCMSG",ND=1
 | 
|---|
| 74 |  K @(MSG)
 | 
|---|
| 75 |  F J="MSH","PID","PV1" I $G(@J)]"" S @(MSG_"("_ND_")")=@J,ND=ND+1
 | 
|---|
| 76 |  I ORC]"" S @(MSG_"("_ND_")")=ORC,ND=ND+1
 | 
|---|
| 77 |  I $D(NTE),$O(NTE(0)) D NTE(.NTE,ND) S ND=ND+1
 | 
|---|
| 78 |  I OBR]"" S @(MSG_"("_ND_")")=OBR,ND=ND+1
 | 
|---|
| 79 |  I $L($G(ZSV)) S @(MSG_"("_ND_")")=ZSV,ND=ND+1
 | 
|---|
| 80 |  I $O(OBX("")) S OBXND=0 D
 | 
|---|
| 81 |  .F  S OBXND=$O(OBX(OBXND)) Q:OBXND=""  D
 | 
|---|
| 82 |  .. S @(MSG_"("_ND_")")=OBX(OBXND)
 | 
|---|
| 83 |  .. S GMRCND1=0 F  S GMRCND1=$O(OBX(OBXND,GMRCND1)) Q:GMRCND1=""  D
 | 
|---|
| 84 |  ... S @(MSG_"("_ND_","_GMRCND1_")")=OBX(OBXND,GMRCND1)
 | 
|---|
| 85 |         .. S ND=ND+1
 | 
|---|
| 86 |  .Q
 | 
|---|
| 87 |  ;I CTRLCD'="XX",$D(NTE),$O(NTE(0)) D NTE(.NTE,ND) S ND=ND+1
 | 
|---|
| 88 |  Q
 | 
|---|
| 89 | HL7DT(DATE) ;Convert Fileman Date to HL-7 Date
 | 
|---|
| 90 |  I 'DATE Q ""
 | 
|---|
| 91 |  Q $$FMTHL7^XLFDT(DATE) ; use standard function
 | 
|---|
| 92 |  N X
 | 
|---|
| 93 |  S X="" I DATE S X=17000000+$P(DATE,".",1)_$P(DATE,".",2)
 | 
|---|
| 94 |  Q X
 | 
|---|
| 95 | FMDATE(DATE) ;Convert HL-7 formatted date to a Fileman formatted date
 | 
|---|
| 96 |  I 'DATE Q ""
 | 
|---|
| 97 |  Q $$HL7TFM^XLFDT(DATE) ; use standard function
 | 
|---|
| 98 |  N X
 | 
|---|
| 99 | ORC(GMRCIEN,GMRCTRL,ORCPLCR,MAINT,GMRCDT) ;Build ORC segment of HL-7 msg
 | 
|---|
| 100 |  ;GMRCTRL=Order Control Code (table 119)
 | 
|---|
| 101 |  ;GMRCIEN=File 123 IEN
 | 
|---|
| 102 |  ;ORPLCR=GMRCPLCR - the person entering the order
 | 
|---|
| 103 |  ;MAINT=1 - group update of requests
 | 
|---|
| 104 |  ;GMRCDT=date/time of activity 
 | 
|---|
| 105 |  N GMRCURG,ORCACT,ORCDT,ORCPRV,ORCDT,ORIEN,ORCSTS,STS,ORCNATR,QUANT,REAS
 | 
|---|
| 106 |  S REAS=$P(GMRCTRL,U,2),GMRCTRL=$P(GMRCTRL,U)
 | 
|---|
| 107 |  S ORCDT=$P(^GMR(123,GMRCIEN,0),"^",7),ORCPRV=$P(^GMR(123,GMRCIEN,0),"^",14),ORURG=$P(^(0),"^",9),ORURG=$S(ORURG]"":$P(^ORD(101,ORURG,0),"^",1),1:"") S:ORURG]"" ORURG=$P(ORURG," - ",2)
 | 
|---|
| 108 |  S ORURG=$S(ORURG="EMERGENCY":"STAT",ORURG="NOW":"STAT",ORURG="OUTPATIENT":"ROUTINE",1:ORURG)
 | 
|---|
| 109 |  S:ORURG="" GMRCURG="" I ORURG]"" S GMRCURG=$O(^ORD(101.42,"B",ORURG,0)),GMRCURG=$S(+GMRCURG:$P(^ORD(101.42,GMRCURG,0),"^",2),1:"")
 | 
|---|
| 110 |  S ORCDT=$$HL7DT(ORCDT)
 | 
|---|
| 111 |  I '$G(GMRCDT) S GMRCDT=$$NOW^XLFDT
 | 
|---|
| 112 |  S STS=$P(^GMR(123,GMRCIEN,0),"^",12)
 | 
|---|
| 113 |  S ORCACT=$P($G(^ORD(100.01,+STS,0)),U,1) S:'$L(ORCACT) ORCACT="NO STATUS"
 | 
|---|
| 114 |  S ORIEN=$P(^GMR(123,GMRCIEN,0),"^",3)
 | 
|---|
| 115 |  S ORCSTS=$S(STS=1:"DC",STS=2:"CM",STS=5:"IP",STS=6:"SC",STS=9:"A",STS=12:"RP",STS=13:"CA",STS=8:"ZC",1:"IP")
 | 
|---|
| 116 |  S ORCNATR=""
 | 
|---|
| 117 |  I GMRCTRL="XX" S ORCNATR="S^SERVICE CORRECTION^99ORN^^"_REAS_"^"
 | 
|---|
| 118 |  I $G(MAINT) S ORCNATR="M^MAINTENANCE^99ORN^^^"
 | 
|---|
| 119 |  S QUANT=$S(GMRCURG]"":"^^^^^"_GMRCURG,1:"")
 | 
|---|
| 120 |  S GMRCDT=$$HL7DT(GMRCDT)
 | 
|---|
| 121 |  S ORC="ORC|"_GMRCTRL_"|"_$S(ORIEN]"":ORIEN_";1^OR",1:"")_"|"
 | 
|---|
| 122 |  S ORC=ORC_GMRCIEN_";GMRC^"_"GMRC"_"||"_ORCSTS_"||"_QUANT_"||"
 | 
|---|
| 123 |  S ORC=ORC_GMRCDT_"|"_ORCPLCR_"||"_ORCPRV_"|||"_ORCDT_"|"_ORCNATR
 | 
|---|
| 124 |  Q
 | 
|---|
| 125 | ZSV(GMRCO) ;build ZSV segment for at least forward
 | 
|---|
| 126 |  N SERV,SERVNM,CTYPE
 | 
|---|
| 127 |  S SERV=$P($G(^GMR(123,GMRCO,0)),U,5)
 | 
|---|
| 128 |  I 'SERV Q
 | 
|---|
| 129 |  S SERVNM=$P($G(^GMR(123.5,SERV,0)),U)
 | 
|---|
| 130 |  S CTYPE=$G(^GMR(123,GMRCO,1.11))
 | 
|---|
| 131 |  I CTYPE=SERVNM S CTYPE=""
 | 
|---|
| 132 |  I $P(^GMR(123,GMRCO,0),U,8) S CTYPE=""
 | 
|---|
| 133 |  S ZSV="ZSV|^^^"_SERV_U_SERVNM_"^99CON|"_CTYPE
 | 
|---|
| 134 |  Q
 | 
|---|