| [613] | 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  ; 
 | 
|---|