| 1 | MAGJUTL3 ;WIRMFO/JHC VistARad subrtns & RPCs ; 29 Jul 2003  10:03 AM
 | 
|---|
| 2 |  ;;3.0;IMAGING;**16,9,22,18,65**;Jul 27, 2006;Build 28
 | 
|---|
| 3 |  ;;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
| 4 |  ;; +---------------------------------------------------------------+
 | 
|---|
| 5 |  ;; | Property of the US Government.                                |
 | 
|---|
| 6 |  ;; | No permission to copy or redistribute this software is given. |
 | 
|---|
| 7 |  ;; | Use of unreleased versions of this software requires the user |
 | 
|---|
| 8 |  ;; | to execute a written test agreement with the VistA Imaging    |
 | 
|---|
| 9 |  ;; | Development Office of the Department of Veterans Affairs,     |
 | 
|---|
| 10 |  ;; | telephone (301) 734-0100.                                     |
 | 
|---|
| 11 |  ;; |                                                               |
 | 
|---|
| 12 |  ;; | The Food and Drug Administration classifies this software as  |
 | 
|---|
| 13 |  ;; | a medical device.  As such, it may not be changed in any way. |
 | 
|---|
| 14 |  ;; | Modifications to this software may result in an adulterated   |
 | 
|---|
| 15 |  ;; | medical device under 21CFR820, the use of which is considered |
 | 
|---|
| 16 |  ;; | to be a violation of US Federal Statutes.                     |
 | 
|---|
| 17 |  ;; +---------------------------------------------------------------+
 | 
|---|
| 18 |  ;;
 | 
|---|
| 19 |  Q
 | 
|---|
| 20 |  ;RPC Entry points:
 | 
|---|
| 21 |  ; LISTINF--Custom list info
 | 
|---|
| 22 |  ; LOGOFF--update session file
 | 
|---|
| 23 |  ; CACHEQ--init session data
 | 
|---|
| 24 |  ; PINF1--Patient info
 | 
|---|
| 25 |  ; USERINF2--P18 inits for the session
 | 
|---|
| 26 |  ;Subrtn EPs:
 | 
|---|
| 27 |  ; LOG--Upd image access log
 | 
|---|
| 28 |  ; MAGJOBNC--inits for non-client sessions
 | 
|---|
| 29 |  ; USERKEYS--user key info
 | 
|---|
| 30 |  ; USERINF--user info
 | 
|---|
| 31 |  ;
 | 
|---|
| 32 | LISTINF(MAGGRY) ; RPC: MAGJ CUSTOM LISTS
 | 
|---|
| 33 |  ;  get Exam List data
 | 
|---|
| 34 |  ; Return in ^TMP($J,"MAGJLSTINF",0:N)
 | 
|---|
| 35 |  ;     0)= # Entries below (0:n)
 | 
|---|
| 36 |  ;   1:n)= Button Label^List #^Button Hints^List Type
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 |  ; MAGGRY holds $NA ref to ^TMP for return message
 | 
|---|
| 39 |  ;   all refs to MAGGRY use SS indirection
 | 
|---|
| 40 |  ;
 | 
|---|
| 41 |  ; GLB has $NA ref to ^MAG(2006.631), Custom Lists
 | 
|---|
| 42 |  ;   refs to GLB use SS indirection to get data from this file
 | 
|---|
| 43 |  ;
 | 
|---|
| 44 |  S X="ERR1^MAGJUTL3",@^%ZOSF("TRAP")
 | 
|---|
| 45 |  N D0,GLB,INF,MAGLST,NAM,T
 | 
|---|
| 46 |  S MAGLST="MAGJLSTINF"
 | 
|---|
| 47 |  K MAGGRY S MAGGRY=$NA(^TMP($J,MAGLST)) K @MAGGRY S @MAGGRY@(0)=0
 | 
|---|
| 48 |  S GLB=$NA(^MAG(2006.631)),NAM=""
 | 
|---|
| 49 |  F  S NAM=$O(@GLB@("B",NAM)) Q:NAM=""  S D0="" D
 | 
|---|
| 50 |  . S D0=$O(@GLB@("B",NAM,D0)) Q:'D0  D
 | 
|---|
| 51 |  . . S X=$G(@GLB@(D0,0)) Q:($P(X,U,2)>9000)!'$P(X,U,6)  ; List Active & User-defined
 | 
|---|
| 52 |  . . S INF="" F I=1:1 S T=$P("7^2^1^3",U,I) Q:T=""  S Y=$P(X,U,T) Q:Y=""  S $P(INF,U,I)=Y
 | 
|---|
| 53 |  . . Q:T'=""  ; req'd fields not all there
 | 
|---|
| 54 |  . . S T=@MAGGRY@(0)+1,^(0)=T,^(T)=INF ; add entry to reply
 | 
|---|
| 55 |  Q
 | 
|---|
| 56 |  ;
 | 
|---|
| 57 | LOG(ACTION,LOGDATA) ; Log exam access
 | 
|---|
| 58 |  N PTCT,TXT,RADFN,MAGIEN,NIMGS,REMOTE
 | 
|---|
| 59 |  S RADFN=$P(LOGDATA,U),MAGIEN=$P(LOGDATA,U,2),NIMGS=$P(LOGDATA,U,3),REMOTE=$P(LOGDATA,U,4)
 | 
|---|
| 60 |  I ACTION="" S ACTION="UNKNOWN"  ; Should never happen
 | 
|---|
| 61 |  S PTCT=RADFN'=$G(MAGJOB("LASTPT",ACTION))
 | 
|---|
| 62 |  I PTCT S MAGJOB("LASTPT",ACTION)=RADFN
 | 
|---|
| 63 |  S TXT=ACTION_U_RADFN_U_MAGIEN_U_U_U_NIMGS
 | 
|---|
| 64 |  S TXT=TXT_U_PTCT_U_$S(+MAGJOB("USER",1):1,1:0)_U_REMOTE
 | 
|---|
| 65 |  ; Session Log
 | 
|---|
| 66 |  D ACTION^MAGGTAU(TXT,1)
 | 
|---|
| 67 |  ; Mag Log
 | 
|---|
| 68 |  I REMOTE S ACTION=ACTION_"/REM"
 | 
|---|
| 69 |  D ENTRY^MAGLOG(ACTION,+DUZ,MAGIEN,"VRAD:"_MAGJOB("VRVERSION"),RADFN,NIMGS)
 | 
|---|
| 70 |  Q
 | 
|---|
| 71 |  ;
 | 
|---|
| 72 | LOGOFF(MAGGRY,DATA) ; RPC: MAGJ LOGOFF
 | 
|---|
| 73 |  ; update session file: logoff time & session entry closed
 | 
|---|
| 74 |  D LOGOFF^MAGGTAU(.MAGGRY)
 | 
|---|
| 75 |  Q
 | 
|---|
| 76 |  ;
 | 
|---|
| 77 | CACHEQ(MAGGRY,DATA) ; RPC: MAGJ CACHELOCATION
 | 
|---|
| 78 |  ; some logon inits & get alternate paths for Remote Reading
 | 
|---|
| 79 |  ; input in DATA:
 | 
|---|
| 80 |  ;  - WSLOC   = WS Loc'n
 | 
|---|
| 81 |  ;  - VRADVER = Client Vs -- p32 ONLY
 | 
|---|
| 82 |  ;  - OSVER   = Client OS Vs -- p32 ONLY
 | 
|---|
| 83 |  ; Return in ^TMP($J,"MAGJCACHE",0:N) (@MAGGRY)
 | 
|---|
| 84 |  ;     0)= # Entries below (0:n)
 | 
|---|
| 85 |  ;   1:n)= PhysName^Subdirectory^HashFlag^Username^Password^AltPath_IEN
 | 
|---|
| 86 |  ;
 | 
|---|
| 87 |  ; MAGGRY holds $NA reference to ^TMP for return message
 | 
|---|
| 88 |  ;   refs to MAGGRY use SS indirection
 | 
|---|
| 89 |  ;
 | 
|---|
| 90 |  ; Also builds local array:  p32/p18 compatibility: Some of this is moved to userinf2 below
 | 
|---|
| 91 |  ;  MAGJOB("LOC",NetworkLocnIEN)=Site Abbrev
 | 
|---|
| 92 |  ;     ("REMOTE")=1/0  (T/F for "User is Remote")
 | 
|---|
| 93 |  ;     ("REMOTESCREEN")=0/1  (init User-switchable Remote Screening--P18 use only)
 | 
|---|
| 94 |  ;     ("WSLOC")=WS Loc'n String
 | 
|---|
| 95 |  ;     ("WSLOCTYP")=WS Loc'n Type
 | 
|---|
| 96 |  ;     ("WSNAME")=WS ID
 | 
|---|
| 97 |  ;     ("VRVERSION")=VRAD Vs
 | 
|---|
| 98 |  ;     ("OSVER")=O/S Vs
 | 
|---|
| 99 |  ;     ("ALTPATH")=1/0 ^ 1/0 (T/F Alt Paths are defined 
 | 
|---|
| 100 |  ;               ^ Alt Paths Enabled/Disabled for most recent exam)
 | 
|---|
| 101 |  ;
 | 
|---|
| 102 |  S X="ERR1^MAGJUTL3",@^%ZOSF("TRAP")
 | 
|---|
| 103 |  ;
 | 
|---|
| 104 |  N I,MAGLST,REPLY,TMP,WSLOC,XX,VRADVER,OSVER,DIQUIET,ALTIEN
 | 
|---|
| 105 |  S DIQUIET=1 D DT^DICRW
 | 
|---|
| 106 |  S REPLY=0,MAGLST="MAGJCACHE"
 | 
|---|
| 107 |  K MAGGRY S MAGGRY=$NA(^TMP($J,MAGLST)) K @MAGGRY
 | 
|---|
| 108 |  S WSLOC=$P(DATA,U),VRADVER=$P(DATA,U,2),OSVER=$P(DATA,U,3)
 | 
|---|
| 109 |  I '$D(MAGJOB("OSVER")) D  ; ID p32 initialization
 | 
|---|
| 110 |  . S MAGJOB("OSVER")=$S(OSVER]"":OSVER,1:"UNK")
 | 
|---|
| 111 |  . S MAGJOB("VRVERSION")=$S(VRADVER]"":VRADVER,1:"UNK")
 | 
|---|
| 112 |  . D MAGJOB ; p32 init of VRAD
 | 
|---|
| 113 |  ; get alt paths location info
 | 
|---|
| 114 |  S MAGJOB("WSLOC")=WSLOC,MAGJOB("REMOTE")=0
 | 
|---|
| 115 |  S MAGJOB("REMOTESCREEN")=+$P($G(^MAG(2006.69,1,0)),U,10)
 | 
|---|
| 116 |  I WSLOC]"" D
 | 
|---|
| 117 |  . S X=$P($G(^MAG(2006.1,+MAGJOB("SITEP"),0)),U,9)
 | 
|---|
| 118 |  . I X]"",(X'=WSLOC) S MAGJOB("REMOTE")=1
 | 
|---|
| 119 |  . E  Q
 | 
|---|
| 120 |  . D LIST^MAGBRTLD(WSLOC,.TMP)
 | 
|---|
| 121 |  . I TMP S REPLY=TMP,MAGJOB("ALTPATH")=$G(MAGJOB("ALTPATH"),"1^1") F I=1:1:TMP D
 | 
|---|
| 122 |  . . S ALTIEN=$P(TMP(I),U,7)
 | 
|---|
| 123 |  . . S XX=$P(TMP(I),U,1,5),X=$P(XX,U,3),$P(XX,U,3)=$S(X="Y":1,1:0)
 | 
|---|
| 124 |  . . S X=$P(XX,U,4),$P(XX,U,4)=$P(XX,U,5),$P(XX,U,5)=X,$P(XX,U,6)=ALTIEN
 | 
|---|
| 125 |  . . S @MAGGRY@(I)=XX,MAGJOB("LOC",ALTIEN)=$P(TMP(I),U,6)
 | 
|---|
| 126 |  I '$D(MAGJOB("ALTPATH")) S MAGJOB("ALTPATH")="0^0"
 | 
|---|
| 127 |  S @MAGGRY@(0)=REPLY
 | 
|---|
| 128 | CACHEQZ Q
 | 
|---|
| 129 |  ;
 | 
|---|
| 130 | MAGJOBNC ; EP for Prefetch/Bkgnd calls (NOT a Vrad Client)
 | 
|---|
| 131 |  N NOTCLIEN S NOTCLIEN=1
 | 
|---|
| 132 |  D MAGJOB
 | 
|---|
| 133 |  Q
 | 
|---|
| 134 |  ;
 | 
|---|
| 135 | MAGJOB ; Init magjob array
 | 
|---|
| 136 |  N T,RIST
 | 
|---|
| 137 |  I $G(MAGJOB("VRVERSION")) S X=MAGJOB("VRVERSION")
 | 
|---|
| 138 |  E  S X="" ; non-client processes assume post-P32 logic
 | 
|---|
| 139 |  S MAGJOB("P32")=(X="3.0.41.17") ; support back-compatible P32 Client
 | 
|---|
| 140 |  D USERKEYS
 | 
|---|
| 141 |  S MAGJOB("CONSOLIDATED")=($G(^MAG(2006.1,"CONSOLIDATED"))="YES")
 | 
|---|
| 142 |  S MAGJOB("SITEP")=$$IMGSIT^MAGJUTL1(DUZ(2),1)  ; Site Param ien
 | 
|---|
| 143 |  S RIST="" F X="S","R" I $D(^VA(200,"ARC",X,DUZ)) S RIST=X Q
 | 
|---|
| 144 |  S RIST=$S(RIST="S":15,RIST="R":12,1:0) ; Staff/Resident/Non rist
 | 
|---|
| 145 |  S MAGJOB("USER",1)=RIST_U_$$USERINF(+DUZ,".01;1") ; RIST_Type^NAME^INI
 | 
|---|
| 146 |  S X=$P($G(IO("CLNM")),"."),MAGJOB("WSNAME")=$S(X]"":X,1:"VistaradWS")
 | 
|---|
| 147 |  K MAGJOB("DIVSCRN") I MAGJOB("CONSOLIDATED") D
 | 
|---|
| 148 |  . ; include logon DIV, other DIVs to screen Unread Lists & Locking
 | 
|---|
| 149 |  . I $G(DUZ(2))]"" S MAGJOB("DIVSCRN",DUZ(2))=""
 | 
|---|
| 150 |  . S DIV=""
 | 
|---|
| 151 |  . I DUZ(2)'=$P(MAGJOB("SITEP"),U,3) D  ; Assoc DIV
 | 
|---|
| 152 |  . . S IEN=$O(^MAG(2006.1,+MAGJOB("SITEP"),"INSTS","B",DUZ(2),0))
 | 
|---|
| 153 |  . . I IEN F  S DIV=$O(^MAG(2006.1,+MAGJOB("SITEP"),"INSTS",IEN,201,"B",DIV)) Q:'DIV  S MAGJOB("DIVSCRN",DIV)=""
 | 
|---|
| 154 |  . E  D  ; Parent DIV
 | 
|---|
| 155 |  . . F  S DIV=$O(^MAG(2006.1,+MAGJOB("SITEP"),201,"B",DIV)) Q:'DIV  S MAGJOB("DIVSCRN",DIV)=""
 | 
|---|
| 156 |  S MAGJOB("WSLOCTYP")=$S(+MAGJOB("USER",1):"RAD",1:"Non-Rad") ; USer is Rist/Not
 | 
|---|
| 157 |  I '$D(MAGJOB("WRKSIEN")) D
 | 
|---|
| 158 |  . Q:+$G(NOTCLIEN)  ; proceed only if Vrad Client is attached
 | 
|---|
| 159 |  . S X=MAGJOB("WSNAME")_"^^^"_MAGJOB("WSLOCTYP")_U_U_U_U_1_U_MAGJOB("OSVER")_U_MAGJOB("VRVERSION")
 | 
|---|
| 160 |  . D UPD^MAGGTAU(.Y,X)
 | 
|---|
| 161 |  . D REMLOCK^MAGJEX1B ; put here to only run 1x/ login
 | 
|---|
| 162 |  Q
 | 
|---|
| 163 |  ;
 | 
|---|
| 164 | USERINF(DUZ,FLDS) ; get data from user file
 | 
|---|
| 165 |  I FLDS=""!'DUZ Q ""
 | 
|---|
| 166 |  N I,RSL,T S RSL=""
 | 
|---|
| 167 |  D GETS^DIQ(200,+DUZ,FLDS,"E","T")
 | 
|---|
| 168 |  S T=+DUZ_","
 | 
|---|
| 169 |  F I=1:1:$L(FLDS,";") S RSL=RSL_$S(RSL="":"",1:U)_T(200,T,$P(FLDS,";",I),"E")
 | 
|---|
| 170 |  Q RSL
 | 
|---|
| 171 |  ;
 | 
|---|
| 172 | USERKEYS ; Store VRad Security Keys in MagJob
 | 
|---|
| 173 |  ;
 | 
|---|
| 174 |  N I,X,Y
 | 
|---|
| 175 |  N MAGKS ; list of keys to send to XUS KEY CHECK
 | 
|---|
| 176 |  N MAGKG ; list returned
 | 
|---|
| 177 |  K MAGJOB("KEYS")
 | 
|---|
| 178 |  S X="MAGJ",I=0
 | 
|---|
| 179 |  F  S X=$O(^XUSEC(X)) Q:$E(X,1,4)'="MAGJ"  D
 | 
|---|
| 180 |  . S I=I+1,MAGKS(I)=X
 | 
|---|
| 181 |  I '$D(MAGKS) Q
 | 
|---|
| 182 |  D OWNSKEY^XUSRB(.MAGKG,.MAGKS)
 | 
|---|
| 183 |  S I=0 F  S I=$O(MAGKG(I)) Q:'I  I MAGKG(I) S MAGJOB("KEYS",MAGKS(I))=""
 | 
|---|
| 184 |  Q
 | 
|---|
| 185 |  ;
 | 
|---|
| 186 |  Q
 | 
|---|
| 187 | PINF1(MAGGRY,MAGDFN) ;RPC Call MAGJ PT INFO -- Get pt info
 | 
|---|
| 188 |  S X="ERR3^MAGJUTL3",@^%ZOSF("TRAP")
 | 
|---|
| 189 |  D INFO^MAGGTPT1(.MAGGRY,MAGDFN_"^1") ; 1=Don't log to session file
 | 
|---|
| 190 |  Q
 | 
|---|
| 191 |  ;
 | 
|---|
| 192 | USERINF2(MAGGRY,DATA) ; rpc: MAGJ USER2 -- Return user info
 | 
|---|
| 193 |  ;  Input = unused ^ Client Vrad Vs ^ Client O/S Vs
 | 
|---|
| 194 |  ;  Reply = 
 | 
|---|
| 195 |  ;  (0) = 1/0^code~Msg |  DUZ ^ NAME ^ INITIALS ^ REQ_FLAG
 | 
|---|
| 196 |  ;  (1)= Net UserName ^ PSW ^ UserType ^ SYSADMIN
 | 
|---|
| 197 |  ;      1/0=Success/Failure flag for vs compatibility
 | 
|---|
| 198 |  ;      code=4 if failure condition
 | 
|---|
| 199 |  ;      Msg=Display msg if failure condition
 | 
|---|
| 200 |  ;      REQ_FLAG = 1/0 (Enable/Disable Requisition for non-rad staff)
 | 
|---|
| 201 |  ;      UserType = 3: Staff R'ist; 2: Resident R'ist; 1: Rad Tech; 0: Non-Rad
 | 
|---|
| 202 |  ;      SYSADMIN = 1/0 1=user has Vrad System User privileges
 | 
|---|
| 203 |  ;
 | 
|---|
| 204 |  S X="ERR2^MAGJUTL3",@^%ZOSF("TRAP")
 | 
|---|
| 205 |  K MAGGRY S MAGGRY(0)="",MAGGRY(1)=""
 | 
|---|
| 206 |  I +$G(DUZ)=0 S MAGGRY(0)="0^4~DUZ Undefined, Null or Zero|" Q
 | 
|---|
| 207 |  N I,J,K,Y,REQ,VRADVER,OSVER,RADTECH,PLACE,REPLY
 | 
|---|
| 208 |  S VRADVER=$P(DATA,U,2),OSVER=$P(DATA,U,3)
 | 
|---|
| 209 |  D CHKVER^MAGJUTL5(.REPLY,VRADVER,.PLACE,.SVERSION)
 | 
|---|
| 210 |  I 'REPLY S MAGGRY(0)=REPLY_"|^^^^",MAGGRY(1)="^^^" G USERIN2Z ; Version check or PLACE failed
 | 
|---|
| 211 |  S RADTECH=""
 | 
|---|
| 212 |  S MAGJOB("OSVER")=$S(OSVER]"":OSVER,1:"UNK")   ; IDs P18 initialization; cf cacheq ep above
 | 
|---|
| 213 |  S MAGJOB("VRVERSION")=$S(VRADVER]"":VRADVER,1:"UNK")
 | 
|---|
| 214 |  S MAGJOB("VSVERSION")=SVERSION
 | 
|---|
| 215 |  D MAGJOB
 | 
|---|
| 216 |  ; Enable/Disable Requisition if not a radiology user
 | 
|---|
| 217 |  S REQ=1
 | 
|---|
| 218 |  I 'MAGJOB("USER",1) D  ; not a rist
 | 
|---|
| 219 |  . I $D(^VA(200,"ARC","T",+DUZ)) S RADTECH=1 Q  ; Rad Tech OK
 | 
|---|
| 220 |  . S X=+$P($G(^MAG(2006.69,1,0)),U,16)
 | 
|---|
| 221 |  . I X S REQ=0 ; Disable Req
 | 
|---|
| 222 |  S MAGGRY(0)=REPLY_"|"_DUZ_U_$$GET1^DIQ(200,DUZ_",",.01)_U_$$GET1^DIQ(200,DUZ_",",1)_U_REQ_U_SVERSION
 | 
|---|
| 223 |  ; Network UserName and PSW
 | 
|---|
| 224 |  S MAGGRY(1)=$P($G(^MAG(2006.1,PLACE,"NET")),U,1,2)
 | 
|---|
| 225 |  S X=+MAGJOB("USER",1),X=$S(X=15:3,X=12:2,+RADTECH:1,1:0)
 | 
|---|
| 226 |  S MAGGRY(1)=MAGGRY(1)_U_X_U_$D(MAGJOB("KEYS","MAGJ SYSTEM USER"))
 | 
|---|
| 227 | USERIN2Z Q
 | 
|---|
| 228 |  ;
 | 
|---|
| 229 | ERR1 N ERR S ERR=$$EC^%ZOSV S @MAGGRY@(0)="0^4~"_ERR G ERR
 | 
|---|
| 230 | ERR2 N ERR S ERR=$$EC^%ZOSV S MAGGRY(0)="0^4~"_ERR G ERR
 | 
|---|
| 231 | ERR3 N ERR S ERR=$$EC^%ZOSV S MAGGRY="0^4~"_ERR
 | 
|---|
| 232 | ERR D @^%ZOSF("ERRTN")
 | 
|---|
| 233 |  Q:$Q 1  Q
 | 
|---|
| 234 |  ;
 | 
|---|
| 235 | END Q  ; 
 | 
|---|