| 1 | GMRCIUTL ;SLC/JFR - UTILITIES FOR INTER-FACILITY CONSULTS ;11/26/01 15:34
 | 
|---|
| 2 |  ;;3.0;CONSULT/REQUEST TRACKING;**22**;DEC 27, 1997
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  Q  ;don't start at the top
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 | DIV(LOC) ; get the division from a hospital location
 | 
|---|
| 7 |  ; Input  -- LOC  HOSPITAL LOCATION file (#44) IEN
 | 
|---|
| 8 |  ; Output -- INSTITUTION file (#4) IEN^INSTITUTION file (#4) NAME
 | 
|---|
| 9 |  ;
 | 
|---|
| 10 |  N GMRCHL,GMRCSTN,GMRCDIV
 | 
|---|
| 11 |  S GMRCHL=$P($G(^SC(+LOC,0)),U,15)
 | 
|---|
| 12 |  I +GMRCHL D
 | 
|---|
| 13 |  . S GMRCSTN=$$SITE^VASITE(,GMRCHL)
 | 
|---|
| 14 |  . I $P(GMRCSTN,U)>0,($P(GMRCSTN,U,2)]"") D
 | 
|---|
| 15 |  . . S GMRCDIV=$P(GMRCSTN,U)_U_$P(GMRCSTN,U,2)
 | 
|---|
| 16 |  I '$G(GMRCDIV) D
 | 
|---|
| 17 |  . S GMRCDIV=+$G(DUZ(2))_U_$P($$NS^XUAF4(+$G(DUZ(2))),U)
 | 
|---|
| 18 |  Q GMRCDIV
 | 
|---|
| 19 |  ;
 | 
|---|
| 20 | HLNAME(GMRCWHO)        ;HL7 format a name from a pointer to 200
 | 
|---|
| 21 |  Q:'$D(^VA(200,+GMRCWHO,0)) ""
 | 
|---|
| 22 |  N GMRC
 | 
|---|
| 23 |  S GMRC("FILE")=200
 | 
|---|
| 24 |  S GMRC("IENS")=GMRCWHO
 | 
|---|
| 25 |  S GMRC("FIELD")=.01
 | 
|---|
| 26 |  Q $$HLNAME^XLFNAME(.GMRC,"S")
 | 
|---|
| 27 |  ;
 | 
|---|
| 28 | UNHLNAME(GMRCNM,GMRCNMC,STD,DEL) ;return regular name from HL7 name
 | 
|---|
| 29 |  ;Input:
 | 
|---|
| 30 |  ;  GMRCNM  = HL7 formatted name from a message
 | 
|---|
| 31 |  ;  GMRCNMC = array to retun name components in (by reference)
 | 
|---|
| 32 |  ;  STD     = 1 or 0; 1 = return name given middle family suffix
 | 
|---|
| 33 |  ;  DEL     = delimiting character separating name components
 | 
|---|
| 34 |  ;
 | 
|---|
| 35 |  ;Output:
 | 
|---|
| 36 |  ;  GMRCNMC=DREW,NANCY M III MD or NANCY M DREW III MD
 | 
|---|
| 37 |  ;  GMRCNMC("FAMILY")=DREW
 | 
|---|
| 38 |  ;  GMRCNMC("GIVEN")=NANCY
 | 
|---|
| 39 |  ;  GMRCNMC("MIDDLE")=M
 | 
|---|
| 40 |  ;  GMRCNM("SUFFIX")=III MD
 | 
|---|
| 41 |  ;
 | 
|---|
| 42 |  I '$D(DEL) S DEL=U
 | 
|---|
| 43 |  S GMRCNMC=GMRCNM
 | 
|---|
| 44 |  S GMRCNMC=$$FMNAME^XLFNAME(.GMRCNMC,"CS")
 | 
|---|
| 45 |  I $G(STD) S GMRCNMC=$$NAMEFMT^XLFNAME(.GMRCNMC,"G","Dc")
 | 
|---|
| 46 |  Q
 | 
|---|
| 47 |  ;
 | 
|---|
| 48 | TRIMWP(ARRAY,PIECE) ;trim OBX or NTE segments so that only comment remains
 | 
|---|
| 49 |  ; Input:
 | 
|---|
| 50 |  ;   ARRAY  = the array in which the segments are contained
 | 
|---|
| 51 |  ;      ex. ^TMP("GMRCIF",541083753,"OBX",3,3)=3|TX|^COMMENTS^|3|text "
 | 
|---|
| 52 |  ;   PIECE  = the piece in the array where the text lives
 | 
|---|
| 53 |  ; 
 | 
|---|
| 54 |  ; Output:
 | 
|---|
| 55 |  ;   trimmed array 
 | 
|---|
| 56 |  ;     ex. ^TMP("GMRCIF",541083753,"OBX",3,3)="text"
 | 
|---|
| 57 |  ;
 | 
|---|
| 58 |  N I S I=0
 | 
|---|
| 59 |  F  S I=$O(@(ARRAY)@(I)) Q:'I  D
 | 
|---|
| 60 |  . S @(ARRAY)@(I)=$P(@(ARRAY)@(I),"|",PIECE)
 | 
|---|
| 61 |  Q
 | 
|---|
| 62 |  ;
 | 
|---|
| 63 | VALMSG(GMRCPID,GMRCORC) ; determine if message is valid
 | 
|---|
| 64 |  ;Input:
 | 
|---|
| 65 |  ;  GMRCPID  = PID segment from an IFC HL7 message
 | 
|---|
| 66 |  ;  GMRCORC  = ORC segment from an IFC HL7 message
 | 
|---|
| 67 |  ;
 | 
|---|
| 68 |  ;Output:
 | 
|---|
| 69 |  ;  1     = message passes screening on patient, institution and ien
 | 
|---|
| 70 |  ;  0^msg = message failed screening
 | 
|---|
| 71 |  ;    possible msg values:
 | 
|---|
| 72 |  ;        
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 |  ;
 | 
|---|
| 75 |  N GMRCDA,GMRCINST
 | 
|---|
| 76 |  Q
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 | URG(GMRCO) ;return urgency code to send in HL7 msg
 | 
|---|
| 79 |  ; Input:
 | 
|---|
| 80 |  ;   GMRCO = consult ien from file 123
 | 
|---|
| 81 |  ;
 | 
|---|
| 82 |  ; Output:
 | 
|---|
| 83 |  ;   S   = stat
 | 
|---|
| 84 |  ;   R   = routine
 | 
|---|
| 85 |  ;   ZT  = today
 | 
|---|
| 86 |  ;   Z24 = within 24 hours
 | 
|---|
| 87 |  ;   Z48 = within 48 hours
 | 
|---|
| 88 |  ;   Z72 = within 72 hours
 | 
|---|
| 89 |  ;   ZW  = within 1 week
 | 
|---|
| 90 |  ;   ZM  = within 1 month
 | 
|---|
| 91 |  ;   ZNA = next available
 | 
|---|
| 92 |  ;   ZE  = emergency
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 |  N URG,PROT,ORURG
 | 
|---|
| 95 |  S PROT=$P(^GMR(123,GMRCO,0),U,9)
 | 
|---|
| 96 |  S URG=$P($G(^ORD(101,+PROT,0)),U),URG=$P(URG," - ",2)
 | 
|---|
| 97 |  I '$L(URG) Q ""
 | 
|---|
| 98 |  S ORURG=$S(URG="EMERGENCY":"STAT",URG="NOW":"STAT",URG="OUTPATIENT":"ROUTINE",1:URG)
 | 
|---|
| 99 |  S ORURG=$O(^ORD(101.42,"B",ORURG,0))
 | 
|---|
| 100 |  I '+ORURG Q ""
 | 
|---|
| 101 |  Q $P(^ORD(101.42,ORURG,0),"^",2)
 | 
|---|
| 102 | GETSERV(GMRCSRV) ;return local service from IFC service in HL7 msg
 | 
|---|
| 103 |  ;Input:
 | 
|---|
| 104 |  ;  GMRCSRV = OBR-4 (e.g. 4^CARDIOLOGY^578VA1235)
 | 
|---|
| 105 |  ;
 | 
|---|
| 106 |  ;Output:
 | 
|---|
| 107 |  ;  ien of local service
 | 
|---|
| 108 |  N SERV,SENDER,ERROR
 | 
|---|
| 109 |  S SERV=$$FIND1^DIC(123.5,"","X",$P(GMRCSRV,U,2))
 | 
|---|
| 110 |  I 'SERV S ERROR="-1^ERROR IN SERVICE NAME^701"
 | 
|---|
| 111 |  I '$D(ERROR) D
 | 
|---|
| 112 |  . S SENDER=$P(GMRCSRV,U,3)
 | 
|---|
| 113 |  . S SENDER=+$$IEN^XUAF4($P(SENDER,"VA1235"))
 | 
|---|
| 114 |  I '$D(ERROR) D
 | 
|---|
| 115 |  . I $O(^GMR(123.5,SERV,"IFCS","B",SENDER,0)) Q
 | 
|---|
| 116 |  . S ERROR="-1^IMPROPER SENDING FACILITY^301"
 | 
|---|
| 117 |  Q $S($D(ERROR):ERROR,1:SERV)
 | 
|---|
| 118 |  ;
 | 
|---|
| 119 | GETPROC(GMRCSID) ;return procedure and sercvice ordered by IFC
 | 
|---|
| 120 |  ;Input:
 | 
|---|
| 121 |  ;  GMRCSID  =OBR-4 from IFC msg  (e.g. "31^EKG^578VA1233" )
 | 
|---|
| 122 |  ;
 | 
|---|
| 123 |  ;Output:
 | 
|---|
| 124 |  ;  string in format  local_proc_ien^service_ien_to perform
 | 
|---|
| 125 |  ;
 | 
|---|
| 126 |  N GMRCSS,GMRCPR,SENDER,ERROR
 | 
|---|
| 127 |  S GMRCPR=$$FIND1^DIC(123.3,"","X",$P(GMRCSID,U,2))
 | 
|---|
| 128 |  I 'GMRCPR S ERROR="-1^ERROR IN PROCEDURE NAME^501"
 | 
|---|
| 129 |  I '$D(ERROR) D
 | 
|---|
| 130 |  . S SENDER=$P(GMRCSID,U,3)
 | 
|---|
| 131 |  . S SENDER=+$$IEN^XUAF4($P(SENDER,"VA1233"))
 | 
|---|
| 132 |  I '$D(ERROR) D
 | 
|---|
| 133 |  . I $O(^GMR(123.3,GMRCPR,"IFCS","B",SENDER,0)) Q
 | 
|---|
| 134 |  . S ERROR="-1^IMPROPER SENDING FACILITY^401"
 | 
|---|
| 135 |  I '$D(ERROR) D
 | 
|---|
| 136 |  . D GETSVC^GMRCPR0(.GMRCSS,GMRCPR)
 | 
|---|
| 137 |  . I GMRCSS>1 S ERROR="-1^MULTIPLE SERVICES DEFINED^601" Q
 | 
|---|
| 138 |  . S GMRCSS=+GMRCSS(1)
 | 
|---|
| 139 |  Q $S($D(ERROR):ERROR,1:GMRCPR_U_GMRCSS)
 | 
|---|
| 140 | CODEOI(GMRCDA) ; look at ordered procedure or service and code it for IFC msg
 | 
|---|
| 141 |  ;Input:
 | 
|---|
| 142 |  ;  GMRCDA = ien from file 123 of consult or procedure to send as IFC
 | 
|---|
| 143 |  ;
 | 
|---|
| 144 |  ;Output:
 | 
|---|
| 145 |  ;  consult:  svc_ien^remote_service_name^station#_VA1235
 | 
|---|
| 146 |  ;  proc:     proc_ien^remote_proc_name^station#_VA1233
 | 
|---|
| 147 |  ;
 | 
|---|
| 148 |  N GMRCPR,GMRCSS,GMRCSIT,GMRCOI
 | 
|---|
| 149 |  S GMRCSIT=$$STA^XUAF4($$KSP^XUPARAM("INST"))
 | 
|---|
| 150 |  I +$P(^GMR(123,GMRCDA,0),U,8) D  ; it's a procedure
 | 
|---|
| 151 |  . S GMRCPR=+$P(^GMR(123,GMRCDA,0),U,8)
 | 
|---|
| 152 |  . S GMRCOI=GMRCPR_U_$P(^GMR(123.3,GMRCPR,"IFC"),U,2)_U_GMRCSIT_"VA1233"
 | 
|---|
| 153 |  I '$D(GMRCOI) D  ; it's a consult
 | 
|---|
| 154 |  . S GMRCSS=$P(^GMR(123,GMRCDA,0),U,5)
 | 
|---|
| 155 |  . S GMRCOI=GMRCSS_U_$P(^GMR(123.5,GMRCSS,"IFC"),U,2)_U_GMRCSIT_"VA1235"
 | 
|---|
| 156 |  Q GMRCOI
 | 
|---|
| 157 |  ;
 | 
|---|
| 158 | RESP(GMRCAC,GMRCMID,GMRCOC,GMRCDA,GMRCERR) ;build and send appl ACK/NAK 
 | 
|---|
| 159 |  ; Input:
 | 
|---|
| 160 |  ;   GMRCAC  = acknowledgement code (AA or AR)
 | 
|---|
| 161 |  ;   GMRCMID = message id from original msg
 | 
|---|
| 162 |  ;   GMRCOC  = order control from original msg ORC
 | 
|---|
| 163 |  ;   GMRCDA  = ien of consult being worked on
 | 
|---|
| 164 |  ;   GMRCERR = only defined if an error is found
 | 
|---|
| 165 |  ;
 | 
|---|
| 166 |  S HLA("HLA",1)=$$MSA^GMRCISEG(GMRCAC,GMRCMID,$G(GMRCERR))
 | 
|---|
| 167 |  I $D(GMRCOC) D
 | 
|---|
| 168 |  . I GMRCOC="NW" S HLA("HLA",2)=$$ORCRESP^GMRCISG1(GMRCDA,"OK","IP")
 | 
|---|
| 169 |  Q
 | 
|---|
| 170 |  ;
 | 
|---|
| 171 | LOGMSG(GMRCO,GMRCACT,GMRCMSG,GMRCER) ;create or update IFC MESSAGE LOG entry
 | 
|---|
| 172 |  ;Input:
 | 
|---|
| 173 |  ; GMRC0   = ien from file 123
 | 
|---|
| 174 |  ; GMRCACT = ien in 40 multiple from file 123
 | 
|---|
| 175 |  ; GMRCMSG = HL7 message ID of message being sent 
 | 
|---|
| 176 |  ; GMRCER  = error number if can't transmit immediately
 | 
|---|
| 177 |  ;
 | 
|---|
| 178 |  N GMRCLG,GMRCERR,FDA
 | 
|---|
| 179 |  S GMRCLG=$O(^GMR(123.6,"AC",GMRCO,GMRCACT,1,0))
 | 
|---|
| 180 |  I +GMRCLG D  Q  ; update existing incomplete record.
 | 
|---|
| 181 |  . S FDA(1,123.6,GMRCLG_",",.01)=$$NOW^XLFDT
 | 
|---|
| 182 |  . S FDA(1,123.6,GMRCLG_",",.03)=$G(GMRCMSG)
 | 
|---|
| 183 |  . S FDA(1,123.6,GMRCLG_",",.07)=$P(^GMR(123.6,GMRCLG,0),U,7)+1
 | 
|---|
| 184 |  . I $G(GMRCER) S FDA(1,123.6,GMRCLG_",",.08)=GMRCER
 | 
|---|
| 185 |  . D UPDATE^DIE("","FDA(1)",,"GMRCERR")
 | 
|---|
| 186 |  ;
 | 
|---|
| 187 |  ; create new record
 | 
|---|
| 188 |  S FDA(1,123.6,"+1,",.01)=$$NOW^XLFDT
 | 
|---|
| 189 |  S FDA(1,123.6,"+1,",.02)=$P(^GMR(123,GMRCO,0),U,23)
 | 
|---|
| 190 |  S FDA(1,123.6,"+1,",.03)=$G(GMRCMSG)
 | 
|---|
| 191 |  S FDA(1,123.6,"+1,",.04)=GMRCO
 | 
|---|
| 192 |  S FDA(1,123.6,"+1,",.05)=GMRCACT
 | 
|---|
| 193 |  S FDA(1,123.6,"+1,",.06)=1
 | 
|---|
| 194 |  S FDA(1,123.6,"+1,",.07)=1
 | 
|---|
| 195 |  I $G(GMRCER) S FDA(1,123.6,"+1,",.08)=GMRCER
 | 
|---|
| 196 |  D UPDATE^DIE("","FDA(1)","GMRCLG","GMRCERR")
 | 
|---|
| 197 |  Q
 | 
|---|
| 198 |  ;
 | 
|---|
| 199 | ERR101 ;Unknown Consult/Procedure request
 | 
|---|
| 200 | ERR201 ;Unknown Patient
 | 
|---|
| 201 | ERR202 ;Local or unknown MPI identifiers
 | 
|---|
| 202 | ERR301 ;Service not matched to receiving facility
 | 
|---|
| 203 | ERR401 ;Procedure not matched to receiving facility
 | 
|---|
| 204 | ERR501 ;Error in procedure name
 | 
|---|
| 205 | ERR601 ;Multiple services matched to procedure
 | 
|---|
| 206 | ERR701 ;Error in Service name
 | 
|---|
| 207 | ERR801 ;Inappropriate action for specified request
 | 
|---|
| 208 | ERR802 ;Duplicate, activity not filed
 | 
|---|
| 209 | ERR901 ;Unable to update record successfully
 | 
|---|
| 210 | ERR902 ;Earlier pending transactions
 | 
|---|
| 211 | ERR903 ;HL Logical Link not found
 | 
|---|
| 212 | ERR904 ;VistA HL7 unable to send transaction
 | 
|---|