| 1 | GMRCIEVT ;SLC/JFR - process events and build HL7 message; 1/27/03 09:23 | 
|---|
| 2 | ;;3.0;CONSULT/REQUEST TRACKING;**22,28,31**;DEC 27, 1997 | 
|---|
| 3 | ; | 
|---|
| 4 | Q  ;don't start at the top | 
|---|
| 5 | TRIGR(IEN,ACTN) ;determine what action was taken on IFC and call event point | 
|---|
| 6 | ;Input: | 
|---|
| 7 | ;  IEN   = consult number from file 123 | 
|---|
| 8 | ;  ACT   = ien in 40 multiple corresponding to activity | 
|---|
| 9 | ; | 
|---|
| 10 | N ACTYPE | 
|---|
| 11 | S ACTYPE=$P(^GMR(123,IEN,40,ACTN,0),U,2) | 
|---|
| 12 | I 'ACTYPE Q | 
|---|
| 13 | I ACTYPE=26 Q  ;don't send admin corrections yet... | 
|---|
| 14 | ; | 
|---|
| 15 | ; check bkgrd job and run if overdue | 
|---|
| 16 | I '$D(ZTQUEUED),$$GONOGO^GMRCIBKG D | 
|---|
| 17 | . N ZTQUEUED S ZTQUEUED=1 D EN^GMRCIBKG ;remove ZTQUEUED? | 
|---|
| 18 | ; | 
|---|
| 19 | I $O(^GMR(123.6,"AC",IEN,ACTN),-1) D  Q  ;earlier pending activities | 
|---|
| 20 | . I ACTYPE=22 Q  ; not a trigger or not done here | 
|---|
| 21 | . I ACTYPE=6 N GMRCQT D  I $D(GMRCQT) Q | 
|---|
| 22 | .. ;complete all transactions if IFC DC'd before request ever sent | 
|---|
| 23 | .. I $O(^GMR(123.6,"AC",IEN,ACTN),-1)'=1 Q  ;new request already sent | 
|---|
| 24 | .. S GMRCQT=1 | 
|---|
| 25 | .. N DA,DIE,DR,GMRCACTS | 
|---|
| 26 | .. S GMRCACTS=0 | 
|---|
| 27 | .. F  S GMRCACTS=$O(^GMR(123.6,"AC",IEN,GMRCACTS)) Q:'GMRCACTS  D | 
|---|
| 28 | ... S DIE="^GMR(123.6,",DA=$O(^GMR(123.6,"AC",IEN,GMRCACTS,1,0)) | 
|---|
| 29 | ... S DR=".06///@" D ^DIE | 
|---|
| 30 | . D LOGMSG^GMRCIUTL(IEN,ACTN,"",902) ;msg log entry but no msg sent | 
|---|
| 31 | I ACTYPE=2!(ACTYPE=1) D NW(IEN) Q  ;send new order | 
|---|
| 32 | I ACTYPE=9!(ACTYPE=14) D RSLT(IEN,ACTN) Q  ;inc report or add'l notes | 
|---|
| 33 | I ACTYPE=10,$P(^GMR(123,IEN,40,ACTN,0),U,9) D RSLT(IEN,ACTN) Q  ;comp | 
|---|
| 34 | I ACTYPE=12 D RSLT(IEN,ACTN) Q  ;dis-associate result | 
|---|
| 35 | I ACTYPE=11 D RESUB^GMRCIEV1(IEN,ACTN) Q  ;ed/resubmit | 
|---|
| 36 | I ACTYPE=13 D RSLT(IEN,ACTN) Q  ; addendum added | 
|---|
| 37 | I ACTYPE=4 D SF^GMRCIEV1(IEN,ACTN) Q  ; sig finding update | 
|---|
| 38 | I ACTYPE=22 Q  ;printed to is not a trigger | 
|---|
| 39 | I ACTYPE=17 D FWD^GMRCIEV1(IEN,ACTN) Q  ; forward | 
|---|
| 40 | I ACTYPE=25 D FWD2IFC^GMRCIEV1(IEN,ACTN) Q  ; FWD into an IFC service | 
|---|
| 41 | D GENUPD(IEN,ACTN) ;all other updates | 
|---|
| 42 | Q | 
|---|
| 43 | NW(GMRCDA) ;build new order message for IFC | 
|---|
| 44 | ; Input: | 
|---|
| 45 | ;   GMRCDA  = ien from file 123 | 
|---|
| 46 | ; | 
|---|
| 47 | N HL,HLL,SEG,GMRC773,GMRCIQT | 
|---|
| 48 | S SEG=1 | 
|---|
| 49 | K ^TMP("HLS",$J) | 
|---|
| 50 | D INIT^HLFNC2("GMRC IFC ORM EVENT",.HL) | 
|---|
| 51 | I $G(HL) D  Q  ; if HL array can't be built, log it with an error | 
|---|
| 52 | . D LOGMSG^GMRCIUTL(GMRCDA,GMRCACT,,904) | 
|---|
| 53 | D  I $D(GMRCIQT) D NOMPI(GMRCDA,1) Q  ;build PID seg if not a local ICN | 
|---|
| 54 | . N GMRCDFN S GMRCDFN=$P(^GMR(123,+GMRCDA,0),U,2) | 
|---|
| 55 | . I '$G(GMRCDFN) S GMRCIQT=1 Q | 
|---|
| 56 | . I $$GETICN^MPIF001(GMRCDFN)<1 S GMRCIQT=1 Q | 
|---|
| 57 | . I $$IFLOCAL^MPIF001(GMRCDFN) S GMRCIQT=1 Q | 
|---|
| 58 | . S ^TMP("HLS",$J,SEG)=$$EN^VAFCPID(GMRCDFN,"1,2,3,4,5,7,8,19") | 
|---|
| 59 | . S SEG=SEG+1 | 
|---|
| 60 | . Q | 
|---|
| 61 | S ^TMP("HLS",$J,SEG)=$$NWORC^GMRCISG1(GMRCDA) ; get ORC for new ord | 
|---|
| 62 | S SEG=SEG+1 | 
|---|
| 63 | S ^TMP("HLS",$J,SEG)=$$OBR^GMRCISG1(GMRCDA) ;get OBR segment | 
|---|
| 64 | S SEG=SEG+1 | 
|---|
| 65 | D  ;build reason for request into OBX segment(s) | 
|---|
| 66 | . K ^TMP("GMRCRFR",$J) | 
|---|
| 67 | . D OBXWP^GMRCISEG(GMRCDA,"NW",1,$NA(^TMP("GMRCRFR",$J))) | 
|---|
| 68 | . I '$D(^TMP("GMRCRFR",$J)) Q | 
|---|
| 69 | . N I S I=0 | 
|---|
| 70 | . F  S I=$O(^TMP("GMRCRFR",$J,I)) Q:'I  D | 
|---|
| 71 | .. S ^TMP("HLS",$J,SEG)=^TMP("GMRCRFR",$J,I) | 
|---|
| 72 | .. S SEG=SEG+1 | 
|---|
| 73 | . K ^TMP("GMRCRFR",$J) | 
|---|
| 74 | . Q | 
|---|
| 75 | S ^TMP("HLS",$J,SEG)=$$OBXPD^GMRCISG1(GMRCDA) ; build prov DX in OBX | 
|---|
| 76 | S SEG=SEG+1 | 
|---|
| 77 | S ^TMP("HLS",$J,SEG)=$$OBXTZ^GMRCISEG ;always send local time zone | 
|---|
| 78 | S HLL("LINKS",1)=$$ROUTE(GMRCDA) I '$L(HLL("LINKS",1)) D  Q  ;log error | 
|---|
| 79 | . D LOGMSG^GMRCIUTL(IEN,ACTN,"",903) | 
|---|
| 80 | D GENERATE^HLMA("GMRC IFC ORM EVENT","GM",1,.GMRC773) | 
|---|
| 81 | N ERR S ERR=$S($P(GMRC773,U,2):904,1:"") | 
|---|
| 82 | D LOGMSG^GMRCIUTL(GMRCDA,1,+GMRC773,ERR) | 
|---|
| 83 | Q | 
|---|
| 84 | ; | 
|---|
| 85 | GENUPD(GMRCDA,GMRCACT) ;build msg and send upon REC, SC or ADD CMT event | 
|---|
| 86 | N HL,HLL,SEG,GMRC773,GMRCIQT | 
|---|
| 87 | S SEG=1 | 
|---|
| 88 | K ^TMP("HLS",$J) | 
|---|
| 89 | D INIT^HLFNC2("GMRC IFC ORM EVENT",.HL) | 
|---|
| 90 | I $G(HL) D  Q  ; if HL array can't be built, log it with an error | 
|---|
| 91 | . D LOGMSG^GMRCIUTL(GMRCDA,GMRCACT,,904) | 
|---|
| 92 | D  I $D(GMRCIQT) D NOMPI(GMRCDA,GMRCACT) Q  ;build PID seg if nat'l ICN | 
|---|
| 93 | . N GMRCDFN S GMRCDFN=$P(^GMR(123,+GMRCDA,0),U,2) | 
|---|
| 94 | . I '$G(GMRCDFN) S GMRCIQT=1 Q | 
|---|
| 95 | . I $$GETICN^MPIF001(GMRCDFN)<1 S GMRCIQT=1 Q | 
|---|
| 96 | . I $$IFLOCAL^MPIF001(GMRCDFN) S GMRCIQT=1 Q | 
|---|
| 97 | . S ^TMP("HLS",$J,SEG)=$$EN^VAFCPID(GMRCDFN,"1,2,3,4,5,7,8,19") | 
|---|
| 98 | . S SEG=SEG+1 | 
|---|
| 99 | . Q | 
|---|
| 100 | D  ;build ORC seg based on GMRCACT | 
|---|
| 101 | . N ACTVT,OC,OS | 
|---|
| 102 | . S ACTVT=$P(^GMR(123,GMRCDA,40,GMRCACT,0),U,2) ; get activity | 
|---|
| 103 | . ;set order control for ORC seg: | 
|---|
| 104 | . ;   v-- IP=cmt RE=adm comp OD=DC OC=cancel SC=sch or receive | 
|---|
| 105 | . S OC=$S(ACTVT=20:"IP",ACTVT=10:"RE",ACTVT=6:"OD",ACTVT=19:"OC",1:"SC") | 
|---|
| 106 | . ;set order status for ORC seg: | 
|---|
| 107 | . ;   v-- SC=sch RE=adm comp DC=DC CA=cancel IP=cmt or receive | 
|---|
| 108 | . S OS=$S(ACTVT=8:"SC",ACTVT=10:"CM",ACTVT=6:"DC",ACTVT=19:"CA",1:"IP") | 
|---|
| 109 | . S ^TMP("HLS",$J,SEG)=$$ORC^GMRCISEG(GMRCDA,OC,OS,GMRCACT) | 
|---|
| 110 | . S SEG=SEG+1 | 
|---|
| 111 | . Q | 
|---|
| 112 | I $L($P(^GMR(123,GMRCDA,0),U,19)) D  ;send sig findings | 
|---|
| 113 | . S ^TMP("HLS",$J,SEG)=$$OBXSF^GMRCISEG(GMRCDA) | 
|---|
| 114 | . S SEG=SEG+1 | 
|---|
| 115 | I $O(^GMR(123,GMRCDA,40,GMRCACT,1,0)) D  ;load up a comment if there | 
|---|
| 116 | . N I | 
|---|
| 117 | . K ^TMP("GMRCMT",$J) | 
|---|
| 118 | . I $P(^TMP("HLS",$J,SEG-1),"|",2)'["O" D | 
|---|
| 119 | .. D OBXWP^GMRCISEG(GMRCDA,"",GMRCACT,$NA(^TMP("GMRCMT",$J))) | 
|---|
| 120 | . I $P(^TMP("HLS",$J,SEG-1),"|",2)["O" D | 
|---|
| 121 | .. N GMRCMT | 
|---|
| 122 | .. D NTE^GMRCISEG(GMRCDA,GMRCACT,.GMRCMT) | 
|---|
| 123 | .. I $D(GMRCMT) M ^TMP("GMRCMT",$J)=GMRCMT | 
|---|
| 124 | . Q:'$O(^TMP("GMRCMT",$J,0)) | 
|---|
| 125 | . S I=0 F  S I=$O(^TMP("GMRCMT",$J,I)) Q:'I  D | 
|---|
| 126 | .. S ^TMP("HLS",$J,SEG)=^TMP("GMRCMT",$J,I) | 
|---|
| 127 | .. S SEG=SEG+1 | 
|---|
| 128 | . K ^TMP("GMRCMT",$J) | 
|---|
| 129 | . Q | 
|---|
| 130 | S ^TMP("HLS",$J,SEG)=$$OBXTZ^GMRCISEG ;always include local time zone | 
|---|
| 131 | S HLL("LINKS",1)=$$ROUTE(GMRCDA) I '$L(HLL("LINKS",1)) D  Q  ;log error | 
|---|
| 132 | . D LOGMSG^GMRCIUTL(IEN,ACTN,"",903) | 
|---|
| 133 | D GENERATE^HLMA("GMRC IFC ORM EVENT","GM",1,.GMRC773) | 
|---|
| 134 | N ERR S ERR=$S($P(GMRC773,U,2):904,1:"") ; if err from HL7, log it | 
|---|
| 135 | D LOGMSG^GMRCIUTL(GMRCDA,GMRCACT,+GMRC773,ERR) | 
|---|
| 136 | Q | 
|---|
| 137 | ; | 
|---|
| 138 | RSLT(GMRCDA,GMRCACT) ;attach or dis-associate results and update | 
|---|
| 139 | N HL,HLL,SEG,GMRC773,GMRCIQT | 
|---|
| 140 | S SEG=1 | 
|---|
| 141 | K ^TMP("HLS",$J) | 
|---|
| 142 | D INIT^HLFNC2("GMRC IFC ORM EVENT",.HL) | 
|---|
| 143 | I $G(HL) D  Q  ; if HL array can't be built, log it with an error | 
|---|
| 144 | . D LOGMSG^GMRCIUTL(GMRCDA,GMRCACT,,904) | 
|---|
| 145 | D  I $D(GMRCIQT) D NOMPI(GMRCDA,GMRCACT) Q  ;build PID seg if nat'l ICN | 
|---|
| 146 | . N GMRCDFN S GMRCDFN=$P(^GMR(123,+GMRCDA,0),U,2) | 
|---|
| 147 | . I '$G(GMRCDFN) S GMRCIQT=1 Q | 
|---|
| 148 | . I $$GETICN^MPIF001(GMRCDFN)<1 S GMRCIQT=1 Q | 
|---|
| 149 | . I $$IFLOCAL^MPIF001(GMRCDFN) S GMRCIQT=1 Q | 
|---|
| 150 | . S ^TMP("HLS",$J,SEG)=$$EN^VAFCPID(GMRCDFN,"1,2,3,4,5,7,8,19") | 
|---|
| 151 | . S SEG=SEG+1 | 
|---|
| 152 | . Q | 
|---|
| 153 | D  ;build ORC seg based on GMRCACT | 
|---|
| 154 | . N ACTVT,OC,OS | 
|---|
| 155 | . S ACTVT=$P(^GMR(123,GMRCDA,40,GMRCACT,0),U,2) ; get activity | 
|---|
| 156 | . S OC="RE" | 
|---|
| 157 | . S OS=$S(ACTVT=9:"A",ACTVT=12:"IP",1:"CM") ; A=part res CM=comp IP=dis | 
|---|
| 158 | . S ^TMP("HLS",$J,SEG)=$$ORC^GMRCISEG(GMRCDA,OC,OS,GMRCACT) | 
|---|
| 159 | . S SEG=SEG+1 | 
|---|
| 160 | I $P(^GMR(123,GMRCDA,40,GMRCACT,0),U,2)'=99 D | 
|---|
| 161 | . S ^TMP("HLS",$J,SEG)=$$OBXRSLT^GMRCISEG(GMRCDA,GMRCACT) | 
|---|
| 162 | . S SEG=SEG+1 | 
|---|
| 163 | S ^TMP("HLS",$J,SEG)=$$OBXTZ^GMRCISEG ;always include local time zone | 
|---|
| 164 | S HLL("LINKS",1)=$$ROUTE(GMRCDA) I '$L(HLL("LINKS",1)) D  Q  ;log error | 
|---|
| 165 | . D LOGMSG^GMRCIUTL(IEN,ACTN,"",903) | 
|---|
| 166 | D GENERATE^HLMA("GMRC IFC ORM EVENT","GM",1,.GMRC773) | 
|---|
| 167 | N ERR S ERR=$S($P(GMRC773,U,2):904,1:"") ; if err from HL7, log it | 
|---|
| 168 | D LOGMSG^GMRCIUTL(GMRCDA,GMRCACT,+GMRC773,ERR) | 
|---|
| 169 | Q | 
|---|
| 170 | ; | 
|---|
| 171 | NOMPI(GMRCIEN,GMRCACTV) ;process MPI exception | 
|---|
| 172 | N GMRCDFN | 
|---|
| 173 | S GMRCDFN=$P(^GMR(123,GMRCIEN,0),U,2) | 
|---|
| 174 | D PTMPIER^GMRCIERR(GMRCDFN) ; send msg to local group for ICN problem | 
|---|
| 175 | D LOGMSG^GMRCIUTL(GMRCIEN,GMRCACTV,,202) ;put inc. entry in MSG log | 
|---|
| 176 | Q | 
|---|
| 177 | ; | 
|---|
| 178 | ROUTE(GMRCDA) ; determine correct routing for IFC msg | 
|---|
| 179 | ; Input: | 
|---|
| 180 | ;  GMRCDA = ien from file 123 | 
|---|
| 181 | ; | 
|---|
| 182 | ; Output: | 
|---|
| 183 | ;   the logical link to send the message to in format | 
|---|
| 184 | ;     "GMRC IFC SUBSC^VHAHIN" | 
|---|
| 185 | ; | 
|---|
| 186 | N SITE,GMRCLINK,STA | 
|---|
| 187 | S SITE=$P(^GMR(123,GMRCDA,0),U,23) I 'SITE Q "" ;no ROUTING FACILITY | 
|---|
| 188 | S STA=$$STA^XUAF4(SITE) | 
|---|
| 189 | I '$L(STA) Q "" ;can't find station num for that site | 
|---|
| 190 | D LINK^HLUTIL3(STA,.GMRCLINK,"I") | 
|---|
| 191 | S GMRCLINK=$O(GMRCLINK(0)) I 'GMRCLINK Q "" ; no link for that site | 
|---|
| 192 | S GMRCLINK=GMRCLINK(GMRCLINK) I '$L(GMRCLINK) Q "" ;no link name | 
|---|
| 193 | Q "GMRC IFC SUBSC^"_GMRCLINK | 
|---|