| 1 | MAGJLS3        ;WIRMFO/JHC Rad. Workstation RPC calls ; 29 Jul 2003  10:00 AM | 
|---|
| 2 | ;;3.0;IMAGING;**16,22,18**;Mar 07, 2006 | 
|---|
| 3 | ;; +---------------------------------------------------------------+ | 
|---|
| 4 | ;; | Property of the US Government.                                | | 
|---|
| 5 | ;; | No permission to copy or redistribute this software is given. | | 
|---|
| 6 | ;; | Use of unreleased versions of this software requires the user | | 
|---|
| 7 | ;; | to execute a written test agreement with the VistA Imaging    | | 
|---|
| 8 | ;; | Development Office of the Department of Veterans Affairs,     | | 
|---|
| 9 | ;; | telephone (301) 734-0100.                                     | | 
|---|
| 10 | ;; |                                                               | | 
|---|
| 11 | ;; | The Food and Drug Administration classifies this software as  | | 
|---|
| 12 | ;; | a medical device.  As such, it may not be changed in any way. | | 
|---|
| 13 | ;; | Modifications to this software may result in an adulterated   | | 
|---|
| 14 | ;; | medical device under 21CFR820, the use of which is considered | | 
|---|
| 15 | ;; | to be a violation of US Federal Statutes.                     | | 
|---|
| 16 | ;; +---------------------------------------------------------------+ | 
|---|
| 17 | ;; | 
|---|
| 18 | Q | 
|---|
| 19 | ; EPs: | 
|---|
| 20 | ; BLDACTV | 
|---|
| 21 | ; | 
|---|
| 22 | BLDACTV(MAGGRY,DATA,MAGLST) ; get subset of Active Exams; called from MAGJLS2 | 
|---|
| 23 | ;MAGGRY - Indirect Global ref of return array | 
|---|
| 24 | ;DATA: Listyp ^ Imaging Types | 
|---|
| 25 | ;Listyp = U  -- UNREAD Exams (Status Category=E) | 
|---|
| 26 | ;   = R  -- RECENT (Sts Cat's D & T) | 
|---|
| 27 | ;   = A  -- ALL Active (Cat's E, D, & T) | 
|---|
| 28 | ;   = P  -- PENDING (Cat W) | 
|---|
| 29 | ;   = N  -- Newly Interpreted Exams (No Cat.-Internal use only) | 
|---|
| 30 | ;ImgTypes = List of Imaging Types to process, or "ALL" for all | 
|---|
| 31 | ; MAGLST = $NA ref to return global; references to it use subscript indirection | 
|---|
| 32 | ; MAGLST optional: input to specify return global to use | 
|---|
| 33 | ; | 
|---|
| 34 | ;* This subrtn can receive U/R/A/P/N (LSTREQ)-- ^_delim list of ImgTypes (IMTYPS) | 
|---|
| 35 | N RADFN,RADTI,RACNI,REMX | 
|---|
| 36 | N HDR,HDRLST,MAGIMGTY,MAGRACNT,MAGRET,LSTREQ,LISTYP,LISCAT,IMTYPS | 
|---|
| 37 | N REPLY,STAT,TYP,SORTMAG,DIQUIET,STATCHK,LASTDT,IMGSONLY,URGORD,REMONLY | 
|---|
| 38 | S DIQUIET=1 D DT^DICRW | 
|---|
| 39 | I $G(MAGLST)="" S MAGLST=$NA(^TMP($J,"MAGJACTIVE")) ; default loc'n if not passed in | 
|---|
| 40 | K ^TMP($J,"MAGRAEX"),@MAGLST | 
|---|
| 41 | S LSTREQ=$P(DATA,U),IMTYPS=$P(DATA,U,2,99) | 
|---|
| 42 | I LSTREQ="U"!(LSTREQ="R")!(LSTREQ="A")!(LSTREQ="P")!(LSTREQ="N")!(LSTREQ="H") | 
|---|
| 43 | E  S REPLY="0^4~Invalid Request (List Type="_LSTREQ_")" G BLDACTVZ | 
|---|
| 44 | S MAGRACNT=0 | 
|---|
| 45 | S X=$G(^MAG(2006.69,1,0)),IMGSONLY=+$P(X,U,7),REMX=+$P(X,U,10) ; show only exams w/ images? | 
|---|
| 46 | S REMONLY=0 | 
|---|
| 47 | I $G(MAGJOB("REMOTE")) D  ; ;show remote cache only? | 
|---|
| 48 | . I MAGJOB("P32") S REMONLY=REMX | 
|---|
| 49 | . E  Q:(LSTREQ="H")  S REMONLY=+$G(MAGJOB("REMOTESCREEN")) | 
|---|
| 50 | S X=$G(^MAG(2006.69,1,1)),URGORD=$P(X,U) | 
|---|
| 51 | S:URGORD="" URGORD="S,U,P,R" S URGORD=$TR(URGORD,",") ; "Priority" sort | 
|---|
| 52 | S HDR=$S(LSTREQ="U":"UNREAD",LSTREQ="R":"RECENT",LSTREQ="P":"PENDING",LSTREQ="A":"UNREAD and RECENT",LSTREQ="N":"NEWLY INTERP",LSTREQ="H":"HISTORY",1:"")_" Exams"_" for IMAGING TYPES: " | 
|---|
| 53 | S LISTYP=$S(LSTREQ="U":"E",LSTREQ="R":"D^T",LSTREQ="A":"E^D^T",LSTREQ="P":"W",LSTREQ="N":"",LSTREQ="H":"",1:"E") | 
|---|
| 54 | S REPLY="0^4~Compiling list of Radiology Exams (ACTIVE)." | 
|---|
| 55 | I $G(BKGPROC),(LSTREQ="R") K ^TMP($J,"NEWINT") S ^TMP($J,"NEWINT")=+$G(^XTMP("MAGJ2","RECENT",0)) | 
|---|
| 56 | I LSTREQ="N" D BLDACT2 G BLDACTVZ | 
|---|
| 57 | I LSTREQ="H" D HISTBLD^MAGJLS3A G BLDACTVZ | 
|---|
| 58 | D BLDACT1 | 
|---|
| 59 | BLDACTVZ ; | 
|---|
| 60 | I 'MAGRACNT S:(REPLY["Compiling") REPLY="0^2~No Exams Found" | 
|---|
| 61 | E  D | 
|---|
| 62 | . I IMTYPS="ALL" S HDR=HDR_" ALL" | 
|---|
| 63 | . E  S Y="" F I=0:1 S Y=$O(HDRLST(Y)) Q:Y=""  S HDR=HDR_$S('I:"",1:", ")_Y | 
|---|
| 64 | . S REPLY=MAGRACNT_U_"1~"_HDR | 
|---|
| 65 | S @MAGLST@(0,1)=REPLY,^(2)="" | 
|---|
| 66 | K ^TMP($J,"MAGRAEX"),^("RAE1") | 
|---|
| 67 | S MAGGRY=MAGLST | 
|---|
| 68 | Q | 
|---|
| 69 | BLDACT1 ; Compile exams by Status codes | 
|---|
| 70 | D BLDSTAT^MAGJLS3A | 
|---|
| 71 | F  S LISCAT=$P(LISTYP,U),LISTYP=$P(LISTYP,U,2,9) Q:LISCAT=""  D | 
|---|
| 72 | . I IMTYPS="ALL" S TYP="" D  Q | 
|---|
| 73 | .. F  S TYP=$O(STAT(LISCAT,TYP)) Q:TYP=""  D IMGTYP(LISCAT,TYP) | 
|---|
| 74 | . E  I +IMTYPS D IMGTYLST(LISCAT,IMTYPS) Q | 
|---|
| 75 | . E  S REPLY="0^4~Invalid Imaging Type" | 
|---|
| 76 | Q | 
|---|
| 77 | BLDACT2 ; Add recently interpreted exams to the "Recent" compile data | 
|---|
| 78 | ; 1st, compile these into their own list | 
|---|
| 79 | N CNT,INDX,RAST,STATCHK,RECLIST,REC,X1,X2 | 
|---|
| 80 | S X=$G(^XTMP("MAGJ2","RECENT",0)),INDX=+$P(X,U,2) | 
|---|
| 81 | F  S INDX=$O(^XTMP("MAGJ2","RECENT",INDX)) Q:'INDX  S X=^(INDX) D | 
|---|
| 82 | . S RADFN=$P(X,U),RADTI=$P(X,U,2),RACNI=$P(X,U,3),(RAST,STATCHK)=$P(X,U,4) | 
|---|
| 83 | . D GETEXAM2^MAGJUTL1(RADFN,RADTI,RACNI,0,.MAGRET) | 
|---|
| 84 | . I MAGRET D SVMAG2A() | 
|---|
| 85 | . S $P(^XTMP("MAGJ2","RECENT",0),U,2)=INDX | 
|---|
| 86 | ; copy the above records to the "RECENT" curlist | 
|---|
| 87 | S RECLIST=+$$CURLIST^MAGJLS2("LS9992") | 
|---|
| 88 | I 'RECLIST S RECLIST=+$G(^XTMP("MAGJ2","BKGND","LS9992",0)) | 
|---|
| 89 | I 'RECLIST Q  ; Recent list not being compiled--skip it! | 
|---|
| 90 | F CNT=1:1:MAGRACNT S X1=@MAGLST@(CNT,1),X2=^(2) D  ; MAGLST described at BLDACTV | 
|---|
| 91 | . S REC=^XTMP("MAGJ2","LS9992",RECLIST,0,1)+1 | 
|---|
| 92 | . S ^XTMP("MAGJ2","LS9992",RECLIST,REC,1)=X1,^(2)=X2 | 
|---|
| 93 | . S $P(^XTMP("MAGJ2","LS9992",RECLIST,0,1),U)=REC | 
|---|
| 94 | Q | 
|---|
| 95 | ; | 
|---|
| 96 | SVMAG2A(PIPE3) ;used by subroutine at tag BLDACTV | 
|---|
| 97 | ; load return array @MAGLST@(n, ... | 
|---|
| 98 | ; Note: ^TMP("MAGRAEX" is set by the subroutine Getexam2^Magjutl1 | 
|---|
| 99 | ; PIPE3 optional; contains data that is passed through the system; e.g. | 
|---|
| 100 | ;   the HISTORY List receives data from the client which is augmented | 
|---|
| 101 | ;   and passed back to the client | 
|---|
| 102 | ;Set outside this subrtn:STATCHK,RAST,LSTREQ,REMONLY,BKGPROC,MAGRACNT,MAGLST | 
|---|
| 103 | ; | 
|---|
| 104 | N MAGDT,SORTDT,IMGCNT,ONL,XX,XX2,Y,RARPT,KEY,RASTCAT,Y2 | 
|---|
| 105 | N REMOTE,MODALITY,DAYCASE,EXCAT,ORD,URG,URG1,PREOP,LASTSSN,CURPRIO,STATUS | 
|---|
| 106 | N REMOTE2,LRFLAG | 
|---|
| 107 | S PIPE3=$G(PIPE3,"") | 
|---|
| 108 | S URG="",PREOP=""   ; <*> Need below until RAO7PC1A returns URG | 
|---|
| 109 | S X=$G(^RADPT(RADFN,"DT",RADTI,"P",RACNI,0)) | 
|---|
| 110 | S ORD=$P(X,U,11) | 
|---|
| 111 | I ORD S Y=$G(^RAO(75.1,ORD,0)),URG=$P(Y,U,6),PREOP=$P(Y,U,12) | 
|---|
| 112 | S XX=$G(^TMP($J,"MAGRAEX",1,1)),XX2=$G(^(2)) | 
|---|
| 113 | I $G(STATCHK),(STATCHK=$P(XX,U,11)) | 
|---|
| 114 | E  I LSTREQ="H" S RAST=$P(XX,U,11) | 
|---|
| 115 | E  Q       ;  index '= stored status | 
|---|
| 116 | S RARPT=$P(XX,U,10) | 
|---|
| 117 | D IMGINFO^MAGJUTL2(RARPT,.Y) | 
|---|
| 118 | S IMGCNT=$P(Y,U),ONL=$P(Y,U,2),MAGDT=$P(Y,U,3),REMOTE=$P(Y,U,4),MODALITY=$P(Y,U,5),PLACE=$P(Y,U,6),KEY=$P(Y,U,7) | 
|---|
| 119 | S REMOTE2=REMOTE | 
|---|
| 120 | I IMGSONLY,'IMGCNT Q  ;only list exams w/ imgs | 
|---|
| 121 | I REMONLY,'REMOTE,'$G(BKGPROC) Q  ; only list remote exams | 
|---|
| 122 | S:PLACE PLACE=$P($G(^MAG(2006.1,PLACE,0)),U,9) | 
|---|
| 123 | I MAGDT="" S MAGDT=$P(XX,U,7) | 
|---|
| 124 | S SORTDT=MAGDT | 
|---|
| 125 | S MAGDT=$$FMTE^XLFDT(MAGDT,"5Z") | 
|---|
| 126 | ; XX 1 RADFN   RADTI    RACNI   RANME    RASSN  <-- from GETEXAM | 
|---|
| 127 | ;    6 RADATE  RADTE    RACN    RAPRC     RARPT | 
|---|
| 128 | ;   11 RAST    DAYCASE  RAELOC   RASTP     RASTORD | 
|---|
| 129 | ;   16 RADTPRT RACPT    IMTYPABB | 
|---|
| 130 | ;XX2 1 REQLOCABB  REQLOCNM  RdRIST  COMPLIC  RAD_DIV | 
|---|
| 131 | ;    6 SITE_CODE  RISTISME  PROCMOD  REQLOCT REQWARD | 
|---|
| 132 | S:'URG URG=9  ;  request urgency default to Routine | 
|---|
| 133 | I URG=9,(PREOP]"") S URG=8  ; dummy val for Pre-Op | 
|---|
| 134 | S URG1=$S(URG=1:"Stat",URG=2:"Urg",URG=8:"PreOp",1:"Rout"),X=$E(URG1),URG1=$F(URGORD,X)-1_"-"_URG1 | 
|---|
| 135 | I PREOP]"",(URG'=8) S URG1=URG1_"/Pre" ; show PreOp & another priority | 
|---|
| 136 | S SORTMAG=$S(+IMGCNT:"A",1:"B") ; sort index: has/not images | 
|---|
| 137 | S DAYCASE=$P(XX,U,12),RASTORD=$P(XX,U,15),STATUS=$P(XX,U,11),RASTCAT=$P(XX2,U,11),LRFLAG=$P(XX2,U,12) | 
|---|
| 138 | S EXCAT="",CURPRIO=0 | 
|---|
| 139 | I STATUS]"" D | 
|---|
| 140 | . S EXCAT=RASTCAT | 
|---|
| 141 | . I RASTORD<2!(EXCAT="W")!('IMGCNT) S CURPRIO=0 ; Cancelled/Waiting/No images: Ignore exam | 
|---|
| 142 | . E  I EXCAT="E" S CURPRIO=1  ; Examined="Current" exam | 
|---|
| 143 | . E  S CURPRIO=2  ; must be a "prior" exam | 
|---|
| 144 | . I CURPRIO,'(ONL="Y") S CURPRIO=3 ; images on jukebox | 
|---|
| 145 | . I MAGJOB("P32"),'(EXCAT="E") S EXCAT="" Q  ; P32 compat. | 
|---|
| 146 | . I RASTORD=9 S EXCAT="C" ; Complete | 
|---|
| 147 | . E  I EXCAT="D"!(EXCAT="T") S EXCAT="I" ; just display one value meaning Interpreted | 
|---|
| 148 | S LASTSSN=$P($P(XX,U,5),"-",3) | 
|---|
| 149 | ; build output string in Y & Y2 | 
|---|
| 150 | S Y=DAYCASE_U_U_$E($P(XX,U,4),1,30)_U_$E($P(XX,U,4))_LASTSSN | 
|---|
| 151 | S Y=Y_U_URG1_U_$E($P(XX,U,9),1,30)_U_MAGDT_U_$E($P(XX,U,14),1,10)_U_IMGCNT | 
|---|
| 152 | S Y=Y_U_ONL_U_$E($P(XX,U,13),1,15)_U_REMOTE | 
|---|
| 153 | S Y=Y_U_SORTMAG_U_SORTDT_U_MODALITY_U_RAST_U_$$RAIMTYP(RAST) | 
|---|
| 154 | S X=$P(XX2,U,7),RISTISME=$S(X:"Y",1:"N") | 
|---|
| 155 | S Y2=$P(XX2,U,1,3)_U_LASTSSN_U_$P(XX2,U,5)_U_PLACE_U_RISTISME_U_$P(XX2,U,8,9)_U_$P(XX,U,17)_U_$P(XX2,U,10) | 
|---|
| 156 | S Y2=Y2_U_"|"_$P(XX,U,1,3)_U_RARPT | 
|---|
| 157 | S Y2=Y2_"|"_PIPE3_"|"_EXCAT_"^^^"_MODALITY_U_$P(XX,U,17)_U_CURPRIO_U_RARPT_U_KEY_U_REMOTE2_U_LRFLAG | 
|---|
| 158 | ; * Note: Keep Pipe piece 4, above, in sync with lstout^magjls2b & magjlst1 * | 
|---|
| 159 | S MAGRACNT=MAGRACNT+1 | 
|---|
| 160 | S @MAGLST@(MAGRACNT,1)=Y,^(2)=Y2  ; save output for one exam | 
|---|
| 161 | I $G(BKGPROC),(LSTREQ="R") S ^TMP($J,"NEWINT",$P(XX,U,1,3))="" | 
|---|
| 162 | Q | 
|---|
| 163 | ; | 
|---|
| 164 | RAIMTYP(RAST)   ; return Imaging Type Abbrev for Status Code | 
|---|
| 165 | N X S X="" I RAST]"" D | 
|---|
| 166 | . S X=$G(RAIMTYP(RAST)) Q:X]"" | 
|---|
| 167 | . S X=$P($G(^RA(72,RAST,0)),U,7) | 
|---|
| 168 | . I X S X=$P($G(^RA(79.2,X,0)),U,3)_"~"_X  ; abb~ien | 
|---|
| 169 | . S RAIMTYP(RAST)=X   ; save for future use | 
|---|
| 170 | Q X | 
|---|
| 171 | ; | 
|---|
| 172 | IMGTYLST(LISCAT,LST)       ; get exams for list of image types for input LISCAT | 
|---|
| 173 | N TYP | 
|---|
| 174 | F  Q:'(LST?1.N.E)  S TYP=+$P(LST,U),LST=$P(LST,U,2,99) D:TYP IMGTYP(LISCAT,TYP) | 
|---|
| 175 | Q | 
|---|
| 176 | ; | 
|---|
| 177 | IMGTYP(LISCAT,IMGTY)       ; process statuses for one Image Type for LISCAT | 
|---|
| 178 | I '$D(^RA(79.2,IMGTY,0)) S REPLY="0^4~Invalid Imaging Type" Q | 
|---|
| 179 | N LST | 
|---|
| 180 | I $D(STAT)<10 D BLDSTAT^MAGJLS3A | 
|---|
| 181 | S (STAT,LST)="" | 
|---|
| 182 | S LASTDT=$P(STAT(LISCAT),U) | 
|---|
| 183 | F  S STAT=$O(STAT(LISCAT,IMGTY,STAT)) Q:STAT=""  S LST=LST_$S(LST="":"",1:U)_STAT,HDRLST(STAT(LISCAT,IMGTY))="" | 
|---|
| 184 | I LST]"" D STATLST(LST) | 
|---|
| 185 | Q | 
|---|
| 186 | ; | 
|---|
| 187 | STATLST(LST)       ; get exams for a list of status codes | 
|---|
| 188 | F  Q:'(LST?1.N.E)  S STAT=+$P(LST,U),LST=$P(LST,U,2,99) D:STAT STAT(STAT) | 
|---|
| 189 | Q | 
|---|
| 190 | ; | 
|---|
| 191 | STAT(RAST)           ; get exams for one status code | 
|---|
| 192 | ; uses File #70) "AS" index of active exams | 
|---|
| 193 | ; | 
|---|
| 194 | N RASTP | 
|---|
| 195 | I $D(^RA(72,RAST)) S RASTP=$P(^(RAST,0),U) | 
|---|
| 196 | E  S REPLY="0^4~Invalid Exam Status" Q | 
|---|
| 197 | I '$D(^RADPT("AS",RAST)) S REPLY="0^2~No exams on file with Exam Status "_RASTP Q | 
|---|
| 198 | S RADFN=0,STATCHK=RAST | 
|---|
| 199 | F  S RADFN=$O(^RADPT("AS",RAST,RADFN)) Q:RADFN'>0  S RADTI=0 D | 
|---|
| 200 | . F  S RADTI=$O(^RADPT("AS",RAST,RADFN,RADTI)) Q:RADTI'>0!(RADTI>LASTDT)  S RACNI=0 D | 
|---|
| 201 | .. F  S RACNI=$O(^RADPT("AS",RAST,RADFN,RADTI,RACNI)) Q:RACNI'>0  D | 
|---|
| 202 | ... D GETEXAM2^MAGJUTL1(RADFN,RADTI,RACNI,0,.MAGRET) | 
|---|
| 203 | ... Q:'MAGRET  ; no exam returned | 
|---|
| 204 | ... D SVMAG2A() | 
|---|
| 205 | Q | 
|---|
| 206 | ; | 
|---|
| 207 | END Q  ; | 
|---|