| 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
 | 
|---|