| 1 | AFJXALRT ;FO-OAKLAND/GMB-PROCESS INFO AND ALERT USER ;3/17/99  13:42 | 
|---|
| 2 | ;;5.1;Network Health Exchange;**6,15,17,23,31,32**;Jan 23, 1996 | 
|---|
| 3 | ; Totally rewritten 11/2001.  (Previously FJ/CWS.) | 
|---|
| 4 | ; ENTER - Invoked by server option AFJXSERVER | 
|---|
| 5 | ; | 
|---|
| 6 | ; DBIAs: | 
|---|
| 7 | ;   1092 - Call DSD^ZISPL and DSDOC^ZISPL1 (Kernel) | 
|---|
| 8 | ;   3587 - Read fields 2 and 9 of file 3.51 (Kernel) | 
|---|
| 9 | ;   3774 - Read field .04 of file 142.99 (Health Summary) | 
|---|
| 10 | ;   3779 - Search file 4.2, read field 1 (MailMan) | 
|---|
| 11 | ENTER ; | 
|---|
| 12 | N XMZ,XMSER | 
|---|
| 13 | D:'$$CLOSED(XQSND) PROCESS(XQMSG) ; Ignore if sending site is closed. | 
|---|
| 14 | S XMSER="S.AFJXSERVER",XMZ=XQMSG D REMSBMSG^XMA1C | 
|---|
| 15 | Q | 
|---|
| 16 | CLOSED(AXFROM) ; Returns 1 if sending site is closed; 0 otherwise. | 
|---|
| 17 | I AXFROM'["@" Q 0 | 
|---|
| 18 | N AXDOMIEN | 
|---|
| 19 | S AXDOMIEN=$$FIND1^DIC(4.2,"","MX",$P($P(AXFROM,"@",2),">",1),"B^C") | 
|---|
| 20 | Q:'AXDOMIEN 0 | 
|---|
| 21 | Q $$GET1^DIQ(4.2,AXDOMIEN_",",1)["C" | 
|---|
| 22 | PROCESS(AXRQXMZ) ; Process data incoming | 
|---|
| 23 | N AXPID,AXSENSIT,AXDFN,AXDOMIEN,AXABORT,AXSPDOC,AXSPDATA,AXTI | 
|---|
| 24 | N AXRQREC,AXRQSSN,AXRQDUZ,AXRQNAME,AXRQWHEN,AXRQSITE,AXRQTYPE,AXRQFROM | 
|---|
| 25 | D INIT | 
|---|
| 26 | I 'AXABORT D | 
|---|
| 27 | . D GATHER | 
|---|
| 28 | . D TRANSFER | 
|---|
| 29 | D FINISH | 
|---|
| 30 | Q | 
|---|
| 31 | INIT ; | 
|---|
| 32 | S (AXABORT,AXTI)=0 | 
|---|
| 33 | K ^TMP("AFJX",$J) | 
|---|
| 34 | D ^%ZISC ; Make sure all devices are closed | 
|---|
| 35 | S AXRQREC=$G(^XMB(3.9,AXRQXMZ,2,1,0)) | 
|---|
| 36 | S AXTI=AXTI+1,^TMP("AFJX",$J,AXTI,0)=AXRQREC | 
|---|
| 37 | S AXTI=AXTI+1,^TMP("AFJX",$J,AXTI,0)="***CONFIDENTIAL Patient Data from "_^XMB("NETNAME")_"*** "_$$FMTE^XLFDT(DT,"2Z") | 
|---|
| 38 | S AXRQSSN=$P(AXRQREC,U,1)  ; Patient SSN | 
|---|
| 39 | S AXRQDUZ=$P(AXRQREC,U,2)  ; Requestor's DUZ | 
|---|
| 40 | S AXRQNAME=$P(AXRQREC,U,3) ; Requestor's name | 
|---|
| 41 | S AXRQWHEN=$P(AXRQREC,U,4) ; Date/Time request was made | 
|---|
| 42 | S AXRQSITE=$P(AXRQREC,U,5) ; Requestor's site | 
|---|
| 43 | S AXRQTYPE=$P(AXRQREC,U,6) ; Type of request | 
|---|
| 44 | S AXRQFROM=AXRQNAME_"@"_AXRQSITE | 
|---|
| 45 | S AXDOMIEN=$$FIND1^DIC(4.2,"","MX",AXRQSITE,"B^C") | 
|---|
| 46 | I 'AXDOMIEN D FAIL("Site not found in DOMAIN file: "_AXRQSITE) Q | 
|---|
| 47 | I 'AXRQSSN D FAIL("SSN not supplied.") Q | 
|---|
| 48 | S AXDFN=$$FIND1^DIC(2,"","X",AXRQSSN,"SSN") | 
|---|
| 49 | I 'AXDFN D FAIL("SSN not found in PATIENT file: "_AXRQSSN) Q | 
|---|
| 50 | D PERSON(AXDFN) Q:AXABORT | 
|---|
| 51 | S AXTI=AXTI+1,^TMP("AFJX",$J,AXTI,0)=AXPID("INFO") | 
|---|
| 52 | D CHKSEGS Q:AXABORT | 
|---|
| 53 | D OPENDEV Q:AXABORT | 
|---|
| 54 | S AXTI=AXTI+1,^TMP("AFJX",$J,AXTI,0)="" | 
|---|
| 55 | S AXSENSIT=+$P($G(^DGSL(38.1,AXDFN,0)),U,2) | 
|---|
| 56 | Q | 
|---|
| 57 | GATHER ; Gather the requested data on the patient (it is sent to spool) | 
|---|
| 58 | N AXDAYS,AXABBR,AXSEG,AXCHK | 
|---|
| 59 | U IO | 
|---|
| 60 | D @AXRQTYPE ; One of "TOTAL", "PHARM", "NHBP", or "BRIEF" | 
|---|
| 61 | D CLOSDEV | 
|---|
| 62 | Q | 
|---|
| 63 | TRANSFER ; Transfer the spool data to the temp global | 
|---|
| 64 | D SPL2TMP^AFJXTRF | 
|---|
| 65 | D DSDOC^ZISPL(AXSPDOC),DSD^ZISPL(AXSPDATA) ; Delete spool doc and data | 
|---|
| 66 | Q | 
|---|
| 67 | FINISH ; Send the data and clean up. | 
|---|
| 68 | S AXTI=$O(^TMP("AFJX",$J,""),-1) | 
|---|
| 69 | S AXTI=AXTI+1,^TMP("AFJX",$J,AXTI,0)="" | 
|---|
| 70 | S AXTI=AXTI+1,^TMP("AFJX",$J,AXTI,0)=$$CJ^XLFSTR("End of CONFIDENTIAL Patient Data from "_^XMB("NETNAME"),79,"*") | 
|---|
| 71 | D SEND | 
|---|
| 72 | K ^TMP("AFJX",$J) | 
|---|
| 73 | I $G(AXSENSIT),'AXABORT D SENSIT | 
|---|
| 74 | D AUDIT | 
|---|
| 75 | Q | 
|---|
| 76 | SEND ; Send the data to the requestor | 
|---|
| 77 | N XMZ,XMSUB,XMY,XMTEXT | 
|---|
| 78 | S XMSUB="Reply for <"_AXRQTYPE_"> "_$E($P($G(AXPID("NAME"),"*UNKNOWN*"),",",1),1,15)_" "_AXRQSSN_" "_^XMB("NETNAME") | 
|---|
| 79 | S XMY("NETWORK,HEALTH EXCHANGE@"_AXRQSITE)="" | 
|---|
| 80 | S XMY("S.AFJXNHDONE@"_AXRQSITE)="" | 
|---|
| 81 | S XMTEXT="^TMP(""AFJX"",$J," | 
|---|
| 82 | D ^XMD | 
|---|
| 83 | Q | 
|---|
| 84 | PERSON(DFN) ; Get personal demographic info about the patient | 
|---|
| 85 | N VA,VADM,VAERR | 
|---|
| 86 | D DEM^VADPT | 
|---|
| 87 | S AXPID("NAME")=VADM(1)      ; Name - last,first | 
|---|
| 88 | S AXPID("SSN")=$P(VADM(2),U) ; SSN  - nnnnnnnnn | 
|---|
| 89 | S AXPID("S-S-N")=VA("PID")   ; SSN  - nnn-nn-nnnn | 
|---|
| 90 | S AXPID("DOB")=$$FMTE^XLFDT(+VADM(3),"5Z")  ; Date of birth - mm/dd/yyyy | 
|---|
| 91 | S AXPID("INFO")=$$LJ^XLFSTR(AXPID("NAME")_"  "_AXPID("S-S-N"),55)_" DOB: "_AXPID("DOB") | 
|---|
| 92 | Q | 
|---|
| 93 | OPENDEV ; Set IOP to a unique name to avoid duplicates | 
|---|
| 94 | N AXSPDEV | 
|---|
| 95 | S AXSPDEV=$$GET1^DIQ(142.99,"1,",.04) | 
|---|
| 96 | I AXSPDEV']"" D FAIL("Can't get spool device name from file 142.99") Q | 
|---|
| 97 | S (IOP,AXSPDEV)=AXSPDEV_";NHE"_AXDFN_"-"_$P($H,",",2) | 
|---|
| 98 | S %ZIS=0 | 
|---|
| 99 | D ^%ZIS Q:'POP | 
|---|
| 100 | D ^%ZISC | 
|---|
| 101 | D FAIL("Can't open spool device: "_AXSPDEV) | 
|---|
| 102 | Q | 
|---|
| 103 | CLOSDEV ; Close the spooler device and get device info | 
|---|
| 104 | ; AXSPDOC  = IEN in file 3.51 of the Spool Document | 
|---|
| 105 | ; AXSPDATA = IEN in file 3.519 of the Spool Data | 
|---|
| 106 | S AXSPDOC=IO("SPOOL") | 
|---|
| 107 | D ^%ZISC | 
|---|
| 108 | F  Q:$$GET1^DIQ(3.51,AXSPDOC_",",2,"I")="r"  H 5  ; Wait until "ready" | 
|---|
| 109 | S AXSPDATA=$$GET1^DIQ(3.51,AXSPDOC_",",9,"I") | 
|---|
| 110 | Q | 
|---|
| 111 | CHKSEGS ; Check to see if all components exist before proceeding | 
|---|
| 112 | N AXSEG,AXABBR,AXCHK | 
|---|
| 113 | S AXCHK=1 | 
|---|
| 114 | D @AXRQTYPE ; "TOTAL", "PHARM", "NHBP", or "BRIEF" | 
|---|
| 115 | Q:'$D(AXCHK("NF")) | 
|---|
| 116 | D FAIL("Can't find segment(s) in file 142.1: "_$E(AXCHK("NF"),2,999)) | 
|---|
| 117 | Q | 
|---|
| 118 | BRIEF ; MED12 - EXTRACT 12 MONTHS OF ALL SEGMENTS | 
|---|
| 119 | S AXDAYS=365 | 
|---|
| 120 | TOTAL ; EXTRACT ALL SEGMENTS WITH NO TIME LIMITATION | 
|---|
| 121 | F AXABBR="DEM","ADC","DC","DS","PRC","OPC","CVF","CVP","ADR","DI","VS","PN","RXOP","RXIV","RXUD","BT","CH","MIC","SP","CY","MEDS","IP","IS","SR","CW","CN","DCS","ORC","CP","NSR","ONC" D EXTRACT | 
|---|
| 122 | Q | 
|---|
| 123 | NHBP ; PHAR12 - EXTRACT 12 MONTHS OF PHARMACY INFORMATION | 
|---|
| 124 | S AXDAYS=365 | 
|---|
| 125 | PHARM ; EXTRACT THE WHOLE PHARMACY | 
|---|
| 126 | F AXABBR="DEM","ADR","RXOP","RXIV","RXUD" D EXTRACT | 
|---|
| 127 | Q | 
|---|
| 128 | EXTRACT ; Extract one component | 
|---|
| 129 | S AXSEG=$$FIND1^DIC(142.1,"","OX",AXABBR,"C") | 
|---|
| 130 | I $G(AXCHK) S:'AXSEG AXCHK("NF")=$G(AXCHK("NF"))_","_AXABBR Q | 
|---|
| 131 | N DFN,GMTSEG,GMTSEGI,GMTSEGC,GMTSTITL,GMTSDLM,GMTSNDM | 
|---|
| 132 | S DFN=AXDFN,GMTSDLM=$G(AXDAYS),GMTSTITL="NHE EXTRACT" | 
|---|
| 133 | S GMTSEG(1)="1^"_AXSEG_"^^"_GMTSDLM_"^^N^L^Y" | 
|---|
| 134 | S (GMTSEGI(AXSEG),GMTSEGC)=1 | 
|---|
| 135 | D EN^GMTS1 | 
|---|
| 136 | Q | 
|---|
| 137 | FAIL(AXERR) ; Note the error. | 
|---|
| 138 | S AXABORT=1 | 
|---|
| 139 | S AXTI=$O(^TMP("AFJX",$J,""),-1) | 
|---|
| 140 | S AXTI=AXTI+1,^TMP("AFJX",$J,AXTI,0)="" | 
|---|
| 141 | S AXTI=AXTI+1,^TMP("AFJX",$J,AXTI,0)=$$CJ^XLFSTR(" PROBLEM REPORT ",79,"-") | 
|---|
| 142 | S AXTI=AXTI+1,^TMP("AFJX",$J,AXTI,0)="" | 
|---|
| 143 | S AXTI=AXTI+1,^TMP("AFJX",$J,AXTI,0)="We couldn't process your NHE request, because of the following problem:" | 
|---|
| 144 | S AXTI=AXTI+1,^TMP("AFJX",$J,AXTI,0)="" | 
|---|
| 145 | S AXTI=AXTI+1,^TMP("AFJX",$J,AXTI,0)=AXERR | 
|---|
| 146 | S AXTI=AXTI+1,^TMP("AFJX",$J,AXTI,0)="" | 
|---|
| 147 | S AXTI=AXTI+1,^TMP("AFJX",$J,AXTI,0)=$$REPEAT^XLFSTR("-",79) | 
|---|
| 148 | Q | 
|---|
| 149 | SENSIT ; Data for sensitive patient was accessed, | 
|---|
| 150 | ; so notify DG SENSITIVITY MAILGROUP | 
|---|
| 151 | N XMZ,XMSUB,XMTEXT,XMY,AXTEXT,AXGRP,XMDUZ,AXNHEDUZ | 
|---|
| 152 | S AXNHEDUZ=$$FIND1^DIC(200,"","X","NETWORK,HEALTH EXCHANGE","B") | 
|---|
| 153 | I 'AXNHEDUZ S AXNHEDUZ=.5 | 
|---|
| 154 | S AXTEXT(1)=$$REPEAT^XLFSTR("@",48) | 
|---|
| 155 | S AXTEXT(2)=$$CJ^XLFSTR("SENSITIVE PATIENT DATA REQUESTED",48) | 
|---|
| 156 | S AXTEXT(3)=$$REPEAT^XLFSTR("@",48) | 
|---|
| 157 | S AXTEXT(4)="" | 
|---|
| 158 | S AXTEXT(5)="Data for SENSITIVE patient: "_AXPID("NAME")_"  "_AXRQSSN | 
|---|
| 159 | S AXTEXT(6)="has been requested by:  "_AXRQFROM | 
|---|
| 160 | S AXGRP=$$GET1^DIQ(43,"1,",509) | 
|---|
| 161 | I AXGRP'="" S XMY("G."_AXGRP)="" ;CFB/SF/TUSC MOD TO USE MAS PAT SENSIT MG. | 
|---|
| 162 | S XMSUB="NETWORK HEALTH EXCHANGE REQUESTED FOR SENSITIVE PATIENT" | 
|---|
| 163 | S XMY(AXNHEDUZ)="" | 
|---|
| 164 | S XMTEXT="AXTEXT(" | 
|---|
| 165 | S XMDUZ=.5 | 
|---|
| 166 | D ^XMD | 
|---|
| 167 | Q | 
|---|
| 168 | AUDIT ; | 
|---|
| 169 | N AXSUCCES | 
|---|
| 170 | S AXSUCCES=$S(AXABORT:"N",1:"Y") | 
|---|
| 171 | I $D(^AFJ(537000,"B",AXRQXMZ)) D DUPLI Q | 
|---|
| 172 | D NEW | 
|---|
| 173 | Q | 
|---|
| 174 | DUPLI ; Look for the same message number to avoid duplicate tracking entries | 
|---|
| 175 | N AXIEN | 
|---|
| 176 | S AXIEN="" | 
|---|
| 177 | F  S AXIEN=$O(^AFJ(537000,"B",AXRQXMZ,AXIEN)) Q:AXIEN=""  D | 
|---|
| 178 | . N DIE,DA,DR | 
|---|
| 179 | . S DIE="^AFJ(537000," | 
|---|
| 180 | . S DA=AXIEN | 
|---|
| 181 | . S DR="9////"_AXSUCCES_";10////"_+$G(AXSENSIT)_";12////"_$$NOW^XLFDT | 
|---|
| 182 | . D ^DIE | 
|---|
| 183 | Q | 
|---|
| 184 | NEW ; | 
|---|
| 185 | N DIC,X,Y,DLAYGO,DD,DO | 
|---|
| 186 | S DIC="^AFJ(537000,",DLAYGO=537000 | 
|---|
| 187 | S DIC(0)="L" | 
|---|
| 188 | S X=AXRQXMZ | 
|---|
| 189 | S DIC("DR")="1////"_AXRQWHEN_";2////"_AXRQTYPE_";3////"_AXRQSSN_";6////"_AXRQDUZ_";7////"_AXRQNAME_";8////"_AXDOMIEN_";9////"_AXSUCCES_";10////"_+$G(AXSENSIT)_";12////"_$$NOW^XLFDT | 
|---|
| 190 | D FILE^DICN | 
|---|
| 191 | Q | 
|---|