| 1 | MDHL7U3 ; HOIFO/WAA -Utilities for CP to process HL7 messages  ; 7/26/00 | 
|---|
| 2 | ;;1.0;CLINICAL PROCEDURES;**6**;Apr 01, 2004;Build 102 | 
|---|
| 3 | ; Reference DBIA #2729 [Supported]  for XMXPAI | 
|---|
| 4 | ; Reference DBIA #4262 [Supported] for HL7 call. | 
|---|
| 5 | ; Reference DBIA #3273 [Subscription] for HL7 call. | 
|---|
| 6 | ; Reference DBIA #10138 [Supported] for HL7 call. | 
|---|
| 7 | ; Reference DBIA #3990 [Supported] for ICDCODE call | 
|---|
| 8 | ; Reference DBIA #1131 [Supported] for XMB("NETNAME") reference | 
|---|
| 9 | ; Reference DBIA #1995 [Supported] for ICPTCOD to handle CPT Codes call | 
|---|
| 10 | ; Reference DBIA #10082 [Supported] for ^ICD9 reference | 
|---|
| 11 | ; Reference DBIA #10111 [Supported] for FILE 3.8 call | 
|---|
| 12 | ; Reference DBIA #10103 [Supported] for XLFDT call | 
|---|
| 13 | ; | 
|---|
| 14 | HL7CHK(MDD702) ; Check to see of there is an entry in 703.1 for a patient. | 
|---|
| 15 | N X | 
|---|
| 16 | S X="1^" | 
|---|
| 17 | D | 
|---|
| 18 | . N Y | 
|---|
| 19 | . I $G(^MDD(702,MDD702,0))="" S X="-1^No Entry in 702." Q | 
|---|
| 20 | . I $D(^MDD(703.1,"ASTUDYID",MDD702))=0 Q | 
|---|
| 21 | . S Y=0 | 
|---|
| 22 | . S Y=$O(^MDD(703.1,"ASTUDYID",MDD702,Y)) I Y>0 S X="-1^This Study has Data on file." | 
|---|
| 23 | . Q | 
|---|
| 24 | Q X | 
|---|
| 25 | XVERT(MDA,MDB) ; Strip out blank Lines | 
|---|
| 26 | Q:MDA="" | 
|---|
| 27 | Q:MDB="" | 
|---|
| 28 | Q:$G(^TMP($J,MDA,1)) | 
|---|
| 29 | N I,CNT,CNT2,NODE,FLG | 
|---|
| 30 | S (CNT,I,FLG)=0 | 
|---|
| 31 | F  S I=$O(^TMP($J,MDA,I)) Q:I<1  D | 
|---|
| 32 | . S NODE=$TR(^TMP($J,MDA,I),$C(10),"") | 
|---|
| 33 | . I NODE="" S FLG=0 Q | 
|---|
| 34 | . I FLG  D  Q | 
|---|
| 35 | . . S CNT2=CNT2+1 | 
|---|
| 36 | . . S ^TMP($J,MDB,CNT,CNT2)=NODE | 
|---|
| 37 | . . Q | 
|---|
| 38 | . I 'FLG D  Q | 
|---|
| 39 | . . S CNT=CNT+1 | 
|---|
| 40 | . . S ^TMP($J,MDB,CNT)=NODE | 
|---|
| 41 | . . S FLG=1,CNT2=0 | 
|---|
| 42 | . . Q | 
|---|
| 43 | . Q | 
|---|
| 44 | Q | 
|---|
| 45 | ; | 
|---|
| 46 | PURGE(MDD7031) ; | 
|---|
| 47 | ; This sub-routine will delete HL7 772 Message text after a message | 
|---|
| 48 | ; been processed by Imaging. | 
|---|
| 49 | Q:'$D(^MDD(703.1,MDD7031,0))  ; No entry found | 
|---|
| 50 | S MDD772=$P(^MDD(703.1,MDD7031,0),U,6) Q:MDD772="" | 
|---|
| 51 | D DELBODY^HLUOPT2(MDD772,"CLINICAL PROCEDURES message purge","^TMP($J,""IN"")") | 
|---|
| 52 | S $P(^MDD(703.1,MDD7031,0),U,6)="" | 
|---|
| 53 | Q | 
|---|
| 54 | ; | 
|---|
| 55 | PHY(X,MDIEN) ; Add the doc who did the exam to the report | 
|---|
| 56 | Q | 
|---|
| 57 | ; This will be implemented with the Doctor Lookup when it comes out. | 
|---|
| 58 | N LINE1,LINE | 
|---|
| 59 | S LINE1=$P(X,"|",17) | 
|---|
| 60 | S LINE=$P(LINE1,"^",2) ; Last | 
|---|
| 61 | S LINE=LINE_$S($P(LINE1,"^",3)'="":", "_$P(LINE1,"^",3),1:"") ; First | 
|---|
| 62 | S LINE=LINE_$S($P(LINE1,"^",4)'="":" "_$P(LINE1,"^",4),1:"") ; MI | 
|---|
| 63 | D ADD(MDIEN,"9",LINE) | 
|---|
| 64 | Q | 
|---|
| 65 | ; | 
|---|
| 66 | CPTICD(X,MDIEN) ; Break out CPT and ICD9 codes | 
|---|
| 67 | N ICD,CPT | 
|---|
| 68 | Q:MDIEN<1 | 
|---|
| 69 | S CPT=$P(X,"|",45) I CPT'="" D FILECD(MDIEN,CPT,"7") | 
|---|
| 70 | S ICD=$P(X,"|",14) I ICD'="" D FILECD(MDIEN,ICD,"8") | 
|---|
| 71 | Q | 
|---|
| 72 | FILECD(MDIEN,CODE,TYPE) ; fILE THE DATA | 
|---|
| 73 | N LINE,Y,I,CNT,RESULT | 
|---|
| 74 | S CNT=$L(CODE,"~") | 
|---|
| 75 | S LINE="" | 
|---|
| 76 | F I=1:1:CNT S Y=$P(CODE,"~",I),RESULT=$P(Y,"^",1),LINE(.2,I,0)=RESULT | 
|---|
| 77 | S LINE(.2,0)="^^"_CNT_"^"_CNT_"^"_$P(%,".") | 
|---|
| 78 | Q:CNT<1  ; file the results if there is any | 
|---|
| 79 | D ADD(MDIEN,TYPE,.LINE,CNT) | 
|---|
| 80 | Q | 
|---|
| 81 | ; | 
|---|
| 82 | ADD(MDIEN,TYPE,LINE,CNT) ; | 
|---|
| 83 | ; Create an entry in the .1 node | 
|---|
| 84 | N NODE,X | 
|---|
| 85 | S NODE=$G(^MDD(703.1,MDIEN,.1,0)) Q:NODE="" | 
|---|
| 86 | S NODE=$P(NODE,"^",3) | 
|---|
| 87 | S NODE=NODE+1 | 
|---|
| 88 | S $P(^MDD(703.1,MDIEN,.1,0),"^",3,4)=NODE_"^"_NODE | 
|---|
| 89 | S $P(^MDD(703.1,MDIEN,.1,NODE,0),"^")=TYPE | 
|---|
| 90 | D NOW^%DTC | 
|---|
| 91 | M ^MDD(703.1,MDIEN,.1,NODE)=LINE | 
|---|
| 92 | Q | 
|---|
| 93 | ; | 
|---|
| 94 | MSGIEN(MDHLIENS,MDHLREST) ; Return the message as definded in MDHLIENS  to the array in MDHLREST | 
|---|
| 95 | ; Only TCP type messages | 
|---|
| 96 | ; input: MDHLIENS= the intern entry number of the message in ^HLMA | 
|---|
| 97 | ; MDHLREST = the return array that will contain the whole HL7 message | 
|---|
| 98 | ; output: return "1^Message complete" if message was successful, "0^reason" if failed. | 
|---|
| 99 | ; | 
|---|
| 100 | N MDHLIEN,MDHLI,MDHLCNT,MDHLZ,RET | 
|---|
| 101 | S (MDHLCNT,MDHLI,RET)=0 | 
|---|
| 102 | I $G(MDHLIENS)="" S RET=RET_"^No IEN defined" Q RET  ; Exit because no IEN for ^HLMA was provided | 
|---|
| 103 | I $G(MDHLREST)="" S RET=RET_"^No Return ARRAY provided" Q RET  ; Exit because no return array was provided | 
|---|
| 104 | I $G(^HLMA(MDHLIENS,0))="" S RET=RET_"^HLMA entry does not exist" Q RET  ; Exit because invalid OR non-EXISTING HLMA ENTRY | 
|---|
| 105 | S MDHLIEN=$P(^HLMA(MDHLIENS,0),U) | 
|---|
| 106 | I MDHLIEN="" S RET=RET_"^No pointer value to file 772" Q RET  ; No Pointer to 772 | 
|---|
| 107 | I $G(^HL(772,MDHLIEN,0))="" S RET=RET_"^772 Entry does not exist" Q RET  ; No 772 entry exist | 
|---|
| 108 | ;get header | 
|---|
| 109 | S MDHLZ=$G(^HLMA(MDHLIENS,"MSH",1,0)) | 
|---|
| 110 | I MDHLZ="" S RET=RET_"^No MSH segment found" Q RET  ; No MSH was found | 
|---|
| 111 | S MDHLCNT=MDHLCNT+1,@MDHLREST@(MDHLCNT)=MDHLZ | 
|---|
| 112 | S MDHLCNT=MDHLCNT+1,@MDHLREST@(MDHLCNT)="" | 
|---|
| 113 | ;get body | 
|---|
| 114 | S MDHLI=0 | 
|---|
| 115 | F  S MDHLI=$O(^HL(772,MDHLIEN,"IN",MDHLI)) Q:'MDHLI  D | 
|---|
| 116 | . S MDHLCNT=MDHLCNT+1 | 
|---|
| 117 | . S @MDHLREST@(MDHLCNT)=$G(^HL(772,MDHLIEN,"IN",MDHLI,0)) | 
|---|
| 118 | . Q | 
|---|
| 119 | I MDHLCNT'>2 S RET=RET_"^No message body found" Q RET  ; There was no body | 
|---|
| 120 | S RET="1^Message complete" | 
|---|
| 121 | Q RET | 
|---|
| 122 | ; | 
|---|
| 123 | CICNV(MDIEN,RETURN) ; This subroutine will read the data in 703.1 and return the results | 
|---|
| 124 | ;in the indicated global | 
|---|
| 125 | N NODE,FLG | 
|---|
| 126 | S FLG=1 | 
|---|
| 127 | Q:MDIEN=""  ; The ien was null | 
|---|
| 128 | Q:RETURN=""  ; the array was null | 
|---|
| 129 | S ARRAY(0)="0^0" | 
|---|
| 130 | I $G(^MDD(703.1,MDIEN,.1,0))="" S FLG=0 Q  ; There is not data. | 
|---|
| 131 | ; Start the processing of ICD/POV codes Value is 8 | 
|---|
| 132 | S NODE=0 | 
|---|
| 133 | I FLG I $G(^MDD(703.1,MDIEN,.1,0))'="" D | 
|---|
| 134 | . F  S NODE=$O(^MDD(703.1,MDIEN,.1,NODE)) Q:NODE<1  D | 
|---|
| 135 | . . S TYPE=$P($G(^MDD(703.1,MDIEN,.1,NODE,0),0),"^",1) | 
|---|
| 136 | . . I TYPE=8 D PROCESS(MDIEN,NODE,TYPE,.ARRAY) | 
|---|
| 137 | . . I TYPE=7 D PROCESS(MDIEN,NODE,TYPE,.ARRAY) | 
|---|
| 138 | . . Q | 
|---|
| 139 | . Q | 
|---|
| 140 | M @RETURN=ARRAY | 
|---|
| 141 | Q | 
|---|
| 142 | PROCESS(MDIEN,NODE,TYPE,ARRAY) ; This will process the data for each | 
|---|
| 143 | N CNT,X,CONT,CODE,AR,TP,LOC | 
|---|
| 144 | S CNT=0,CONT=0 | 
|---|
| 145 | F  S CNT=$O(^MDD(703.1,MDIEN,.1,NODE,.2,CNT)) Q:CNT<1  D | 
|---|
| 146 | . S CODE=$G(^MDD(703.1,MDIEN,.1,NODE,.2,CNT,0),"") ; Grabbing the ICD9 AND CPT codes | 
|---|
| 147 | . I CODE="" Q | 
|---|
| 148 | . I TYPE=8 S AR=1,TP="POV",X=$$ICDDX^ICDCODE(CODE) Q:X=""  ; Reference DBIA #3990 [Supported] for ICDCODE call | 
|---|
| 149 | . I TYPE=7 S AR=2,TP="CPT",X=$$CPT^ICPTCOD(CODE) Q:X=""  ; Reference DBIA #1995 [Supported] for ICPTCOD to handle CPT Codes call | 
|---|
| 150 | . S CONT=CONT+1 | 
|---|
| 151 | . S ARRAY(AR)=CONT_"^"_CONT | 
|---|
| 152 | . I AR=1 D | 
|---|
| 153 | . . N DESC,IN,LN | 
|---|
| 154 | . . S IN=$P(X,"^",1) Q:IN<1 | 
|---|
| 155 | . . S LN=$G(^ICD9(IN,0),0) Q:LN="" | 
|---|
| 156 | . . S DESC=$P(LN,"^",3) Q:DESC="" | 
|---|
| 157 | . . S I=CONT | 
|---|
| 158 | . . S $P(ARRAY(AR,I),"^",1)=TP | 
|---|
| 159 | . . S $P(ARRAY(AR,I),"^",2)=$P(X,"^",1) | 
|---|
| 160 | . . S $P(ARRAY(AR,I),"^",3)=$P(X,"^",2) | 
|---|
| 161 | . . S $P(ARRAY(AR,I),"^",5)=DESC | 
|---|
| 162 | . . S $P(ARRAY(AR,I),"^",6)=$S(I=1:1,1:0) | 
|---|
| 163 | . . Q | 
|---|
| 164 | . I AR=2 D | 
|---|
| 165 | . . N DESC,IN,LN | 
|---|
| 166 | . . S IN=$P(X,"^",1) Q:IN<1 | 
|---|
| 167 | . . ; S LN=$G(^ICPT(IN,0),0) Q:LN="" | 
|---|
| 168 | . . S DESC=$P(X,"^",3) Q:DESC=""  ; DBIA1995 $$CPT^ICPTCOD(CODE) returns X and the second piece of X is the DESC | 
|---|
| 169 | . . S I=CNT | 
|---|
| 170 | . . S $P(ARRAY(AR,I),"^",1)=TP | 
|---|
| 171 | . . S $P(ARRAY(AR,I),"^",2)=$P(X,"^",1) | 
|---|
| 172 | . . S $P(ARRAY(AR,I),"^",3)=$P(X,"^",2) | 
|---|
| 173 | . . S $P(ARRAY(AR,I),"^",5)=DESC | 
|---|
| 174 | . . S $P(ARRAY(AR,I),"^",7)=$S(I=1:1,1:0) | 
|---|
| 175 | . . Q | 
|---|
| 176 | . Q | 
|---|
| 177 | I $D(ARRAY(1))!$D(ARRAY(2)) S ARRAY(0)="1^1" | 
|---|
| 178 | Q | 
|---|
| 179 | ; | 
|---|
| 180 | NOTICE(SUBJECT,TXT,DEVIEN,DUZ) ; This will fire off a mail message to the Indicated mail group saying that a study was deleted | 
|---|
| 181 | ; | 
|---|
| 182 | N INST,MG,XMTO,XMDUZ,XMSUBJ,XMBODY,N,X | 
|---|
| 183 | S MG=0 | 
|---|
| 184 | S INST=DEVIEN | 
|---|
| 185 | I INST>1 S MG=$P($G(^MDS(702.09,INST,0)),"^",2) | 
|---|
| 186 | I 'MG!('$$MG^MDHL7U2(MG)) S MG=$$FIND1^DIC(3.8,"","BX","MD DEVICE ERRORS") Q:'MG | 
|---|
| 187 | S MG=$$GET1^DIQ(3.8,+MG_",",.01) | 
|---|
| 188 | S XMTO="G."_MG_"@"_^XMB("NETNAME"),XMINSTR("FROM")=.5 | 
|---|
| 189 | S XMBODY="TXT" | 
|---|
| 190 | S XMSUBJ=SUBJECT | 
|---|
| 191 | D SENDMSG^XMXAPI(DUZ,XMSUBJ,XMBODY,XMTO,.XMINSTR) | 
|---|
| 192 | Q | 
|---|
| 193 | ; | 
|---|
| 194 | ALERT(MDSIEN) ; This is to send an e-mail to the main device mail group that a study has been deleted | 
|---|
| 195 | D NOW^%DTC | 
|---|
| 196 | S SUBJECT="Study "_MDSIEN_" for Patient "_$$GET1^DIQ(702,MDSIEN,.01,"E")_" has been DELETED!" | 
|---|
| 197 | S BODY(1)="The following study has been deleted." | 
|---|
| 198 | S BODY(2)="         By the USER:       "_$$GET1^DIQ(200,DUZ,.01,"E") | 
|---|
| 199 | S BODY(3)="             On Date:       "_$$FMTE^XLFDT(%,1) | 
|---|
| 200 | S BODY(4)="           " | 
|---|
| 201 | S BODY(5)="                   CP Study Information" | 
|---|
| 202 | S BODY(6)="------------------------------------------------------------------------------ " | 
|---|
| 203 | S BODY(7)="CP Study ID:       "_MDSIEN | 
|---|
| 204 | S BODY(8)="CP Study Def:      "_$$GET1^DIQ(702,MDSIEN,.04,"E") | 
|---|
| 205 | S BODY(9)="Created on:        "_$$FMTE^XLFDT($$GET1^DIQ(702,MDSIEN,.02,"I"),1) | 
|---|
| 206 | S BODY(10)="Created by:        "_$$GET1^DIQ(702,MDSIEN,.03,"E") | 
|---|
| 207 | S BODY(11)="On Instrument:     "_$$GET1^DIQ(702,MDSIEN,.11,"E") | 
|---|
| 208 | S BODY(12)="For Patient:       "_$$GET1^DIQ(702,MDSIEN,.01,"E") | 
|---|
| 209 | S BODY(13)="        SSN:       "_$E($$GET1^DIQ(702,MDSIEN,.011,"E"),6,9) | 
|---|
| 210 | S BODY(14)="        DOB:       "_$$FMTE^XLFDT($$GET1^DIQ(702,MDSIEN,.012,"I"),1) | 
|---|
| 211 | S DEVIEN=$$GET1^DIQ(702,MDSIEN,.11,"I") | 
|---|
| 212 | Q | 
|---|