| 1 | RMPRHL7A ;HINES CIOFO/HNC - Receive HL-7 CPRS Message, parse into components and store in File 668 ;3/13/00 | 
|---|
| 2 | ;;3.0;PROSTHETICS;**45,78**;Feb 09, 1996 | 
|---|
| 3 | ; | 
|---|
| 4 | ;Patch #78 - 09/25/03 - TH - Add multiple DG1 and ZCL segments. | 
|---|
| 5 | ; | 
|---|
| 6 | Q | 
|---|
| 7 | URG(X) ;Return Urgency give Z-code from HL-7 segment; see ORC+9 | 
|---|
| 8 | S X=$S(X="S":"STAT",X="R":"ROUTINE",X="ZT":"TODAY",X="Z24":"WITHIN 24 HOURS",X="Z48":"WITHIN 48 HOURS",X="Z72":"WITHIN 72 HOURS",X="ZW":"WITHIN 1 WEEK",X="ZM":"WITHIN 1 MONTH",X="ZNA":"NEXT AVAILABLE",1:X) | 
|---|
| 9 | I $E(X,1)="Z" S X=$S(X="ZT":"TODAY",X="ZE":"EMERGENCY",1:"") | 
|---|
| 10 | Q X | 
|---|
| 11 | ; | 
|---|
| 12 | ORC(RMPRORC) ;Get fields from ORC segment and set into RMPR variables | 
|---|
| 13 | ;RMPRTRLC=ORC control code from HL7 Table 119 | 
|---|
| 14 | ;RMPRURGI=priority/urgency     RMPRPLCR=who entered the order | 
|---|
| 15 | ;RMPRORNP=provider             RMPRNATO=nature of order | 
|---|
| 16 | ;RMPRAD=date of request        RMPROCR=order request reason | 
|---|
| 17 | ;RMPR RMPRORFN=oe/rr file number | 
|---|
| 18 | ;RMPRO=file 668 IEN - if not a new order | 
|---|
| 19 | ;RMPRS38=order status - taken from Table 38, HL7 standard | 
|---|
| 20 | I $E(RMPRMSG,1,6)'="ORC|NW" S RMPRQT=1 Q | 
|---|
| 21 | S RMPRTRLC=$P(RMPRORC,"|",2) | 
|---|
| 22 | S RMPRORFN=$P(RMPRORC,"|",3) | 
|---|
| 23 | S RMPRORFN=$P($P(RMPRORFN,"^",1),";",1) | 
|---|
| 24 | S RMPRAPP=$P($P(RMPRORC,"|",3),"^",2) | 
|---|
| 25 | S RMPRS38=$P(RMPRORC,"|",6) | 
|---|
| 26 | S RMPRURGI=$P($P(RMPRORC,"|",8),"^",6) | 
|---|
| 27 | S RMPRPLCR=$P(RMPRORC,"|",11) | 
|---|
| 28 | S RMPRORNP=$P(RMPRORC,"|",13) | 
|---|
| 29 | I $L(RMPRURGI) S RMPRURGI=$$URG(RMPRURGI) | 
|---|
| 30 | S RMPRO=+$P($P(RMPRORC,"|",4),"^",1) | 
|---|
| 31 | N RMPRODT S RMPRODT=$P(RMPRORC,"|",16) | 
|---|
| 32 | S RMPRAD=$$FMDATE^RMPRHL7(RMPRODT) | 
|---|
| 33 | S RMPROCR=$P(RMPRORC,"|",17) | 
|---|
| 34 | S RMPRNATO=$P(RMPROCR,"^",5) | 
|---|
| 35 | Q | 
|---|
| 36 | OBR(RMPROBR) ;Get fields from OBR segment and set into RMPR variables | 
|---|
| 37 | ;RMPRSS=type of consult, field 9, 1-4 if NO, then not prosthetics | 
|---|
| 38 | ;Must have 99CON in RMPR99C. | 
|---|
| 39 | ; | 
|---|
| 40 | ;RMPRODT=observation date/time | 
|---|
| 41 | ;RMPRPRI=procedure from file ^ORD(101, | 
|---|
| 42 | ; | 
|---|
| 43 | N RMPR99C | 
|---|
| 44 | S RMPR99C=$P($P(RMPROBR,"|",5),"^",6) | 
|---|
| 45 | I RMPR99C'="99CON" S RMPRSS="NO",RMPRQT=1 Q | 
|---|
| 46 | S RMPRSST=$P($P(RMPROBR,"|",5),"^",4) | 
|---|
| 47 | S RMPRSS=$P(^GMR(123.5,RMPRSST,0),U,1) D | 
|---|
| 48 | .;translate to set of codes | 
|---|
| 49 | .I RMPRSS["PROSTHETICS REQUEST" S RMPRSS=1 Q | 
|---|
| 50 | .I RMPRSS["CONTACT LENS REQUEST" S RMPRSS=3 Q | 
|---|
| 51 | .I RMPRSS["HOME OXYGEN REQUEST" S RMPRSS=4 Q | 
|---|
| 52 | .I RMPRSS["EYEGLASS REQUEST" S RMPRSS=2 Q | 
|---|
| 53 | .;then not prosthetics | 
|---|
| 54 | .S RMPRSS="NO" | 
|---|
| 55 | ; | 
|---|
| 56 | I RMPRSS="NO" S RMPRQT=1 Q | 
|---|
| 57 | ; | 
|---|
| 58 | S RMPRODT=$P(RMPROBR,"|",7) | 
|---|
| 59 | I RMPRODT]"" S RMPRODT=$$FMDATE^RMPRHL7(RMPRODT) | 
|---|
| 60 | S RMPRATN=$P(RMPROBR,"|",20) | 
|---|
| 61 | S RMPRSTDT=$P(RMPROBR,"|",23) | 
|---|
| 62 | S RMPRSTDT=$$FMDATE^RMPRHL7(RMPRSTDT) | 
|---|
| 63 | S RMPRS668=$P(RMPROBR,"|",26) | 
|---|
| 64 | S RMPRINTR=$P(RMPROBR,"|",33) | 
|---|
| 65 | Q | 
|---|
| 66 | ; | 
|---|
| 67 | DG1(RMPRDG1) ;Get fields from DG1 and ZCL segments | 
|---|
| 68 | ; RMPRSID = Set ID | 
|---|
| 69 | ; RMPRDIAG = pointer to ICD DIAGNOSIS (#80) | 
|---|
| 70 | ; RMPRCI = Outpat. Classification Type | 
|---|
| 71 | ; RMPRVAL = Value of each SC or EI - 0,1,Null. | 
|---|
| 72 | S RMPRMSG=MSG(RMPRDG1) | 
|---|
| 73 | S RMPRSID=$P(RMPRMSG,"|",2) | 
|---|
| 74 | I $P(RMPRMSG,"|",1)="DG1" D | 
|---|
| 75 | . S RMPRDIAG=$P($P(RMPRMSG,"|",4),"^",1) | 
|---|
| 76 | . S RMPRMSG1(RMPRSID,1)=RMPRDIAG | 
|---|
| 77 | I $P(RMPRMSG,"|",1)="ZCL" D | 
|---|
| 78 | . S RMPRCI=$P(RMPRMSG,"|",3) | 
|---|
| 79 | . S RMPRVAL=$P(RMPRMSG,"|",4) | 
|---|
| 80 | . S RMPRMSG1(RMPRSID,RMPRCI+1)=RMPRVAL | 
|---|
| 81 | Q | 
|---|
| 82 | ; | 
|---|
| 83 | ZSV(RMPRZSV) ;Get service from ZSV segment | 
|---|
| 84 | S RMPRZSS=$P($P(RMPRZSV,"|",2),"^",4) | 
|---|
| 85 | ;Set the service if ZSV provided | 
|---|
| 86 | I $L($P(RMPRZSV,"|",3)) S RMPROTXT=$P(RMPRZSV,"|",3) ;consult type | 
|---|
| 87 | Q | 
|---|
| 88 | ; | 
|---|
| 89 | OBX(RMPROBX) ;Get fields from OBX segment and set into RMPR variables | 
|---|
| 90 | ;RMPRVTYP=Value type from table 668-i.e. TX(text), ST(string data),etc. | 
|---|
| 91 | ;RMPROID=observation id identifying value in seg. 5 | 
|---|
| 92 | ;RMPRVAL=observation value coded by segment 3 | 
|---|
| 93 | ;RMPRPRDG=provisional diagnosis | 
|---|
| 94 | ;free text or code^free text^I9C | 
|---|
| 95 | S RMPRMSG=MSG(RMPROBX) | 
|---|
| 96 | S RMPRVTYP=$P(RMPRMSG,"|",3),RMPROID=$P($P(RMPRMSG,"|",4),"^",2) | 
|---|
| 97 | S RMPRVAL=$P(RMPROID,"^",3) | 
|---|
| 98 | I RMPROID="REASON FOR REQUEST" D | 
|---|
| 99 | .S RMPRRFQ(1)=$P(RMPRMSG,"|",6) | 
|---|
| 100 | .S LN=0 F  S LN=$O(MSG(RMPROBX,LN)) Q:LN=""  S RMPRRFQ(LN+1)=MSG(RMPROBX,LN) | 
|---|
| 101 | .Q | 
|---|
| 102 | I RMPROID="PROVISIONAL DIAGNOSIS" D  Q | 
|---|
| 103 | . I RMPRVTYP="TX" S RMPRPRDG=$P(RMPRMSG,"|",6) Q | 
|---|
| 104 | . I RMPRVTYP="CE" D  Q | 
|---|
| 105 | .. N PRDXSEG S PRDXSEG=$P(RMPRMSG,"|",6) | 
|---|
| 106 | .. S RMPRPRDG=$P(PRDXSEG,"^",2)_" ("_$P(PRDXSEG,"^")_")" | 
|---|
| 107 | .. S RMPRPRCD=$P(PRDXSEG,"^") | 
|---|
| 108 | I RMPROID["COMMENT" D | 
|---|
| 109 | .S RMPRCMT(1)=$P(RMPRMSG,"|",6) | 
|---|
| 110 | .S LN=0 F  S LN=$O(MSG(RMPROBX,NL)) Q:LN=""  S RMPRCMT(LN+1)=MSG(RMPROBX,LN) | 
|---|
| 111 | .Q | 
|---|
| 112 | K LN | 
|---|
| 113 | Q | 
|---|
| 114 | ; | 
|---|
| 115 | EN(MSG) ;Entry point from protocol RMPR RECEIVE | 
|---|
| 116 | ; | 
|---|
| 117 | ;MSG = local array which contains the HL-7 segments | 
|---|
| 118 | ;RMPRFAC=sending facility | 
|---|
| 119 | ;RMPRMTP=message type | 
|---|
| 120 | N DFN,RMPRACT,RMPRADD,RMPRFAC,RMPRMTP,RMPRPNM,RMPRO,RMPROCR,RMPRORNP | 
|---|
| 121 | N RMPRORFN,RMPRPLCR,RMPRRB,RMPRSEND,RMPRSTS,RMPRTRLC,RMPRWARD,ORIFN | 
|---|
| 122 | N RMPRTRLC,RMPRAD,ORC,RMPRSBR,RMPRZSS,RMPRSS,RMPRSST,RMPROTXT | 
|---|
| 123 | N RMPRMSGO | 
|---|
| 124 | S RMPRMSG="",RMPRNOD=0,RMPRI=0 | 
|---|
| 125 | F  S RMPRNOD=$O(MSG(RMPRNOD)) Q:RMPRNOD=""  S RMPRMSG=MSG(RMPRNOD) I $E(RMPRMSG,1,3)="MSH" D  Q | 
|---|
| 126 | .S RMPRSEND=$P(RMPRMSG,"|",3),RMPRFAC=$P(RMPRMSG,"|",4),RMPRMTP=$P(RMPRMSG,"|",9) | 
|---|
| 127 | .Q | 
|---|
| 128 | ;RMPRQT, stop flag in loop | 
|---|
| 129 | S RMPRMSG="",RMPRNOD=0,RMPRQT=0,N=0 | 
|---|
| 130 | F  S RMPRNOD=$O(MSG(RMPRNOD)) Q:RMPRNOD=""  Q:RMPRQT=1  S RMPRMSG=MSG(RMPRNOD) D | 
|---|
| 131 | .I $E(RMPRMSG,1,3)="PID" D PID^RMPRHL7U(RMPRMSG) Q | 
|---|
| 132 | .I $E(RMPRMSG,1,3)="PV1" D PV1^RMPRHL7U(RMPRMSG) Q | 
|---|
| 133 | .;look at ORC|NW for new order | 
|---|
| 134 | .I $E(RMPRMSG,1,3)="ORC" D ORC(RMPRMSG) Q | 
|---|
| 135 | .I RMPRQT=1 Q | 
|---|
| 136 | .I $E(RMPRMSG,1,3)="OBR" D OBR(RMPRMSG) I RMPRSS="NO" S RMPRQT=1 K RMPRSS Q | 
|---|
| 137 | .I RMPRQT=1 Q | 
|---|
| 138 | .;Patch #78 - Add multiple DG1 and ZCL segments | 
|---|
| 139 | .I $E(RMPRMSG,1,3)="DG1"!($E(RMPRMSG,1,3)="ZCL") D DG1(RMPRNOD) Q | 
|---|
| 140 | .;look at ZSV for Prosthetic (4) | 
|---|
| 141 | .I $E(RMPRMSG,1,3)="ZSV" D ZSV(RMPRMSG) Q | 
|---|
| 142 | .I $E(RMPRMSG,1,3)="OBX" D OBX(RMPRNOD) Q | 
|---|
| 143 | .;I $E(RMPRMSG,1,3)="NTE" D NTE^RMPRHL7U(.MSG,RMPRNOD,RMPRO,RMPRTRLC) Q | 
|---|
| 144 | .Q | 
|---|
| 145 | K N | 
|---|
| 146 | ;check for new order, NW, and a prosthetic consult in RMPRSS | 
|---|
| 147 | I '$D(RMPRTRLC) D EXIT^RMPRHL7U Q | 
|---|
| 148 | I RMPRTRLC'="NW" D EXIT^RMPRHL7U Q | 
|---|
| 149 | I '$D(RMPRSS) D EXIT^RMPRHL7U Q | 
|---|
| 150 | I RMPRSS="NO" D EXIT^RMPRHL7U Q | 
|---|
| 151 | ; | 
|---|
| 152 | D NEW^RMPRHL7B | 
|---|
| 153 | ; | 
|---|
| 154 | I '$D(RMPRO) D REJECT^RMPRHL7U(.MSG,"unable to file order"),EXIT^RMPRHL7U Q | 
|---|
| 155 | ; | 
|---|
| 156 | D RTN(RMPRORFN,.RMPRO) | 
|---|
| 157 | ; | 
|---|
| 158 | D EXIT^RMPRHL7U | 
|---|
| 159 | Q | 
|---|
| 160 | ; | 
|---|
| 161 | RTN(RMPRORN,RMPRO) ;Put ^OR(100, ien for order into ^RMPR(668, | 
|---|
| 162 | S DA=RMPRO | 
|---|
| 163 | S DIE="^RMPR(668,",DR="19////^S X=RMPRORN" | 
|---|
| 164 | L +^RMPR(668,RMPRO) D ^DIE L -^RMPR(668,RMPRO) | 
|---|
| 165 | K DIE,DR | 
|---|
| 166 | ; set file 123 ien | 
|---|
| 167 | S RMPRGMRC=$$PKGID^ORX8($P(^RMPR(668,RMPRO,0),U,14)) | 
|---|
| 168 | I RMPRGMRC["GMRC" S $P(^RMPR(668,RMPRO,0),U,15)=+RMPRGMRC | 
|---|
| 169 | E  D REJECT^RMPRHL7U(.MSG),EXIT^RMPRHL7U | 
|---|
| 170 | Q | 
|---|