1 | MAGJEX1A ;WIRMFO/JHC VistARad RPCs, exam locking ; 15 Sep 2004 10:00 AM
|
---|
2 | ;;3.0;IMAGING;**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 | ; Entry Points:
|
---|
21 | ; CASLOCK--RPC: Lock mgt
|
---|
22 | ; LOCKACT--Subrtn
|
---|
23 | ; LOCKOUT--Subrtn
|
---|
24 | ;
|
---|
25 | ERR N ERR S ERR=$$EC^%ZOSV S @MAGGRY@(0)="0^4~"_ERR
|
---|
26 | D @^%ZOSF("ERRTN")
|
---|
27 | Q:$Q 1 Q
|
---|
28 | ;
|
---|
29 | CASLOCK(MAGGRY,DATA) ; RPC Call: MAGJ RADCASELOCKS
|
---|
30 | ; MAGGRY holds $NA reference to ^TMP for rpc reply; all ref's to MAGGRY use ss indirection
|
---|
31 | ; input in DATA: OPEN_FLAG^RADFN^RADTI^RACNI^RARPT
|
---|
32 | ; OPEN_FLAG = 3: Reserve-to-Lock; 4: Lock-to-Reserve; 5: Lock/Take
|
---|
33 | ; RADFN^, etc--exam id
|
---|
34 | ;
|
---|
35 | N $ETRAP,$ESTACK S $ETRAP="D ERR^MAGJEX1A"
|
---|
36 | N RARPT,RADFN,RADTI,RACNI,DIQUIET,CURCASE,REPLY,CT,DATAOUT,MAGLST,XX
|
---|
37 | N DAYCASE,LOCKED,RACN,RADTE,MAGS,LOGDATA,RESULT,MYLOCK,GOTLOCK
|
---|
38 | S DIQUIET=1 D DT^DICRW
|
---|
39 | S CT=0,DATAOUT="",DAYCASE="",MAGLST="MAGJCASELOCK"
|
---|
40 | K MAGGRY S MAGGRY=$NA(^TMP($J,MAGLST)) K @MAGGRY ; assign MAGGRY
|
---|
41 | S CURCASE=+$P(DATA,U)
|
---|
42 | S RADFN=$P(DATA,U,2),RADTI=$P(DATA,U,3),RACNI=$P(DATA,U,4),RARPT=+$P(DATA,U,5)
|
---|
43 | I "^3^4^5^"[(U_CURCASE_U)
|
---|
44 | E S REPLY="4~Invalid Caselock request ("_DATA_")." G CASLOCKZ
|
---|
45 | I RADFN,RADTI,RACNI,RARPT
|
---|
46 | E S REPLY="4~Caselock Request contains invalid Case Pointer ("_DATA_")." G CASLOCKZ
|
---|
47 | S XX=$G(^RADPT(RADFN,"DT",RADTI,"P",RACNI,0))
|
---|
48 | S RACN=$P(XX,U)
|
---|
49 | S RADTE=9999999.9999-RADTI
|
---|
50 | S DAYCASE=$E(RADTE,4,7)_$E(RADTE,2,3)_"-"_RACN
|
---|
51 | S X=$P(XX,U,3)
|
---|
52 | I '$D(^RA(72,"AVC","E",X)) D G CASLOCKZ
|
---|
53 | . N STS S STS=X
|
---|
54 | . D LOCKACT(RARPT,DAYCASE,100,.RESULT) ; between reserve and now, exam may have been Taken & Updated
|
---|
55 | . I +RESULT(1)!+RESULT(2) D LOCKACT(RARPT,DAYCASE,101,.RESULT) ; so, cancel any lock/reserve
|
---|
56 | . S REPLY="5~For Case #"_DAYCASE_", current Status is "_$P(^RA(72,STS,0),U)_"; Reserve/Lock change NOT allowed."
|
---|
57 | D LOCKACT(RARPT,DAYCASE,CURCASE,.RESULT,.REPLY)
|
---|
58 | S GOTLOCK=+RESULT
|
---|
59 | D LOCKACT(RARPT,DAYCASE,100,.MYLOCK)
|
---|
60 | I GOTLOCK&+MYLOCK(1)&(CURCASE=3!(CURCASE=5)) D ; update Image access log if got the lock
|
---|
61 | . S LOGDATA=$P(MYLOCK(2),"|",2) ; was saved when the Reserve occurred
|
---|
62 | . I CURCASE=5 S $P(LOGDATA,U,4)=+MAGJOB("REMOTE") ; update "remote" indicator if was TAKEN
|
---|
63 | . D LOG^MAGJUTL3("VR-VW",LOGDATA)
|
---|
64 | . S $P(^XTMP("MAGJ","LOCK",RARPT,1,DAYCASE),"|",2)=LOGDATA ; save for Interp event
|
---|
65 | S DATAOUT=$S(+MYLOCK(1):1,+MYLOCK(2):2,1:0)
|
---|
66 | ;
|
---|
67 | CASLOCKZ ;
|
---|
68 | S @MAGGRY@(0)=CT_U_REPLY_"|"_RADFN_U_RADTI_U_RACNI_U_RARPT_"||"_DATAOUT
|
---|
69 | Q
|
---|
70 | ;
|
---|
71 | PNAM(X) ; return pt name for input DFN
|
---|
72 | I X S X=$G(^DPT(+X,0)) I X]"" S X=$P(X,U)
|
---|
73 | E S X="UNKNOWN"
|
---|
74 | Q X
|
---|
75 | ;
|
---|
76 | LOCKACT(RARPT,DAYCASE,REQUEST,RESULT,ACTREPLY,LOGDATA) ; determine if desired lock action is feasible
|
---|
77 | ; Input: RARPT, DAYCASE, REQUEST, LOGDATA
|
---|
78 | ; REQUESTed Action:
|
---|
79 | ; 1-Lock; 2-Reserve; 3-ResToLock; 4-LockToRes; 5-TakeLock; 100-Status; 101-UNLOCK
|
---|
80 | ; Note: 100 & 101 are special for internal use only
|
---|
81 | ; LOGDATA--pass through for Image Access Log
|
---|
82 | ; Output: RESULT, ACTREPLY
|
---|
83 | ; RESULT: ACTION "allowed" = LOCK^RESERVE^ResToInt^IntToRes^Take^_"|"_ImgLst
|
---|
84 | ; these are truth values; Imglst true =~ return Image File list to client
|
---|
85 | ; RESULT is ultimately used at tag LOCKOUT
|
---|
86 | ; ACTREPLY --reply message for client logic/display
|
---|
87 | ;
|
---|
88 | N ACTION,LOCKLEV,MYLOCK
|
---|
89 | K RESULT S ACTION="",ACTREPLY="",RESULT="" S LOGDATA=$G(LOGDATA,"")
|
---|
90 | I '$P($G(^MAG(2006.69,1,0)),U,4) Q ; Status Updates not enabled
|
---|
91 | I REQUEST=100 D LOCKIN^MAGJEX1B(RARPT,.LOCKLEV,.RESULT,"STATUS") G LOCKACTZ ; Lock Status check only
|
---|
92 | S ACTION="0^0^0^0^0|0"
|
---|
93 | D LOCKIN^MAGJEX1B(RARPT,.LOCKLEV,.MYLOCK)
|
---|
94 | I REQUEST=101 D G LOCKACT1 ; Unlock exam
|
---|
95 | . M ACTREPLY=MYLOCK ; internal use by MAGJUPD1
|
---|
96 | I 'LOCKLEV D G LOCKACT1
|
---|
97 | . I REQUEST=1!(REQUEST=2) S $P(ACTION,"|",2)=1,ACTREPLY="5~Exam #"_DAYCASE_" is Locked by "_$P(MYLOCK(1),U,4)_"." ; View/Cancel
|
---|
98 | . E S ACTREPLY="3~Invalid exam lock request ("_REQUEST_")--#0"
|
---|
99 | I LOCKLEV=3 D ; Is or Can be Reserved or Interp by me
|
---|
100 | . I MYLOCK(1) D Q ; Already Locked/TAKEN by me
|
---|
101 | . . I REQUEST=1 D Q
|
---|
102 | . . . I MAGJOB("P32") S $P(ACTION,U)=1,$P(ACTION,U,2)=1,$P(ACTION,"|",2)=1,ACTREPLY="1~#"_DAYCASE_" ("_$$PNAM(RADFN)_") locked for update by "_$P(MAGJOB("USER",1),U,3)
|
---|
103 | . . . E S $P(ACTION,U,1)=1,$P(ACTION,U,2)=+MYLOCK(2),ACTREPLY="1~Exam #"_$P(MYLOCK(1),U,6)_" already open/locked--no action taken"
|
---|
104 | . . I REQUEST=4 D Q ; Remove Lock, keep Reserve
|
---|
105 | . . . S $P(ACTION,U,2)=1,$P(ACTION,U,4)=1,ACTREPLY="1~Exam unlocked, reserved"
|
---|
106 | . . E S $P(ACTION,U,1)=1,$P(ACTION,U,2)=+MYLOCK(2),ACTREPLY="3~Invalid exam lock request ("_REQUEST_")--#1"
|
---|
107 | . E I MYLOCK(2) D Q ; Already Reserved by me
|
---|
108 | . . I REQUEST=3 S $P(ACTION,U)=1,$P(ACTION,U,2)=1,$P(ACTION,U,3)=1,ACTREPLY="1~#"_DAYCASE_" ("_$$PNAM(RADFN)_") locked for update (from reserve) by "_$P(MAGJOB("USER",1),U,3)
|
---|
109 | . . E I REQUEST=2 S $P(ACTION,U,2)=1,ACTREPLY="1~Exam #"_$P(MYLOCK(2),U,6)_" already reserved--no action taken."
|
---|
110 | . . E S $P(ACTION,U,2)=1,ACTREPLY="3~Invalid exam lock request ("_REQUEST_")--#2"
|
---|
111 | . E D ; Available
|
---|
112 | . . I REQUEST=1 S $P(ACTION,U)=1,$P(ACTION,U,2)=1,$P(ACTION,"|",2)=1,ACTREPLY="1~#"_DAYCASE_" ("_$$PNAM(RADFN)_") locked for update by "_$P(MAGJOB("USER",1),U,3)
|
---|
113 | . . E I REQUEST=2 S $P(ACTION,U,2)=1,$P(ACTION,"|",2)=1,ACTREPLY="1~Exam #"_DAYCASE_" reserved."
|
---|
114 | . . E S ACTREPLY="3~Invalid exam lock request ("_REQUEST_")--#3"
|
---|
115 | E I LOCKLEV=1 D ; Reserved by other (I can Take, Except View/Take/Cancel)
|
---|
116 | . I MYLOCK(1) D Q
|
---|
117 | . . I REQUEST=1 D Q
|
---|
118 | . . . I MAGJOB("P32") S $P(ACTION,U)=1,$P(ACTION,"|",2)=1,ACTREPLY="1~#"_DAYCASE_" ("_$$PNAM(RADFN)_") locked for update by "_$P(MAGJOB("USER",1),U,3) ; should be impossible
|
---|
119 | . . . E S $P(ACTION,U)=1,ACTREPLY="1~Exam #"_$P(MYLOCK(1),U,6)_" already locked; no action taken."
|
---|
120 | . . E I REQUEST=2 S $P(ACTION,U,1)=1,ACTREPLY="1~Exam #"_$P(MYLOCK(1),U,6)_" already locked; no action taken."
|
---|
121 | . . ; <*> next line Unlocks ME, and preserves Other User's Reserve
|
---|
122 | . . E I REQUEST=4 S $P(ACTION,U,4)=1,ACTREPLY="1~Exam unlocked; reserved by "_$P(MYLOCK(2),U,4)_"."
|
---|
123 | . . E S $P(ACTION,U)=1,ACTREPLY="3~Invalid exam lock request ("_REQUEST_")--#5; Lock retained." ; preserve lock
|
---|
124 | . I 'MYLOCK D Q
|
---|
125 | . . I REQUEST=1 D Q
|
---|
126 | . . . I MAGJOB("P32") S $P(ACTION,"|",2)=1,ACTREPLY="5~Case #"_DAYCASE_" is Reserved by "_$P(MYLOCK(2),U,4)_"."
|
---|
127 | . . . E S $P(ACTION,"|",2)=1,ACTREPLY="8~Case #"_DAYCASE_" is Reserved by "_$P(MYLOCK(2),U,4)_"." ; #8=View/Take/Cancel"
|
---|
128 | . . E I REQUEST=2 S $P(ACTION,"|",2)=1,ACTREPLY="5~Case #"_DAYCASE_" is Reserved by "_$P(MYLOCK(2),U,4)_"."
|
---|
129 | . . E I REQUEST=5 S $P(ACTION,U)=1,$P(ACTION,U,5)=1,ACTREPLY="1~#"_DAYCASE_" ("_$$PNAM(RADFN)_") taken/locked for update by "_$P(MAGJOB("USER",1),U,3)
|
---|
130 | . . E S ACTREPLY="3~Invalid exam lock request ("_REQUEST_")--#6"
|
---|
131 | E I LOCKLEV=2 D ; Locked by another
|
---|
132 | . I MYLOCK(2) D Q
|
---|
133 | . . S $P(ACTION,U,3)=1,ACTREPLY="5~Case #"_DAYCASE_" is Locked (taken) by "_$P(MYLOCK(1),U,4)_"; reserve cancelled." ; View/Cancel"
|
---|
134 | . I 'MYLOCK D Q
|
---|
135 | . . I REQUEST=1!(REQUEST=2) S $P(ACTION,"|",2)=1,ACTREPLY="5~Case #"_DAYCASE_" is Locked by "_$P(MYLOCK(1),U,4)_"." ; View/Cancel"
|
---|
136 | . . E S ACTREPLY="3~Invalid exam lock request ("_REQUEST_")--#8"
|
---|
137 | ;
|
---|
138 | LOCKACT1 D LOCKOUT(RARPT,DAYCASE,LOCKLEV,.MYLOCK,ACTION,.RESULT,LOGDATA)
|
---|
139 | ;
|
---|
140 | LOCKACTZ Q
|
---|
141 | ;
|
---|
142 | ;
|
---|
143 | LOCKOUT(RARPT,DAYCASE,LOCKLEV,MYLOCK,ACTION,RESULT,LOGDATA) ; Record Locks and Clear Locks, as required
|
---|
144 | ; Precursors are logic and data from tags LOCKIN^magjex1b and LOCKACT
|
---|
145 | S RESULT="" S LOGDATA=$G(LOGDATA,"")
|
---|
146 | Q:'LOCKLEV ; nothing to do
|
---|
147 | N ILOCK
|
---|
148 | F ILOCK=1,2 D ; 1:Lock 2:Reserve
|
---|
149 | . I ILOCK=1&(LOCKLEV=1!(LOCKLEV=3))
|
---|
150 | . E I ILOCK=2&(LOCKLEV=2!(LOCKLEV=3))
|
---|
151 | . E Q
|
---|
152 | . I MYLOCK(ILOCK) D ; NEVER change order of the logic below!
|
---|
153 | . . I '$P(ACTION,U,ILOCK) D
|
---|
154 | . . . K ^XTMP("MAGJ","LOCK",RARPT,ILOCK)
|
---|
155 | . . . S $P(RESULT,U,ILOCK)=0
|
---|
156 | . . L -^XTMP("MAGJ","LOCK",RARPT,ILOCK) ; reset lock
|
---|
157 | . ; index by DayCase manages locks for Printset Exams (>1 DayCase for one RARPT)
|
---|
158 | . ; a lock on any printset member exam effectively locks all related exams
|
---|
159 | . I +$P(ACTION,U,ILOCK),'MYLOCK(ILOCK) D
|
---|
160 | . . S ^XTMP("MAGJ","LOCK",RARPT,ILOCK,DAYCASE)=DUZ_U_$J_U_$H_U_$P(MAGJOB("USER",1),U,2,3)_U_"|"_LOGDATA
|
---|
161 | . . S ^XTMP("MAGJ","LOCK",RARPT,ILOCK)=DAYCASE
|
---|
162 | . . S $P(RESULT,U,ILOCK)=1
|
---|
163 | . I '$P(ACTION,U,ILOCK) L -^XTMP("MAGJ","LOCK",RARPT,ILOCK) ; reset or clear lock
|
---|
164 | Q
|
---|
165 | ;
|
---|
166 | END Q ;
|
---|