1 | PXRMRULE ; SLC/PJH - Build Patient list from Rule Set ;08/11/2006
|
---|
2 | ;;2.0;CLINICAL REMINDERS;**4**;Feb 04, 2005;Build 21
|
---|
3 | ;
|
---|
4 | ; Called from PXRM PATIENT LIST CREATE protocol
|
---|
5 | ;
|
---|
6 | ASK(PLIEN,OPT) ;Verify patient list name
|
---|
7 | N X,Y,TEXT
|
---|
8 | K DIROUT,DIRUT,DTOUT,DUOUT
|
---|
9 | S DIR(0)="YA0"
|
---|
10 | S DIR("A")=OPT_" patient list "_$P($G(^PXRMXP(810.5,PLIEN,0)),U)_"?: "
|
---|
11 | S DIR("B")="N"
|
---|
12 | S DIR("?")="Enter Y or N. For detailed help type ??"
|
---|
13 | W !
|
---|
14 | D ^DIR K DIR
|
---|
15 | I $D(DIROUT) S DTOUT=1
|
---|
16 | I $D(DTOUT)!($D(DUOUT)) Q
|
---|
17 | I $E(Y(0))="N" S DUOUT=1 Q
|
---|
18 | Q
|
---|
19 | ;
|
---|
20 | CLEAR(RULE,NODE) ;Clear workfile entries
|
---|
21 | N SEQ
|
---|
22 | S SEQ=""
|
---|
23 | F S SEQ=$O(^PXRM(810.4,RULE,30,"B",SEQ)) Q:'SEQ D
|
---|
24 | .K ^TMP($J,NODE_SEQ)
|
---|
25 | ;clear FDA array
|
---|
26 | K ^TMP($J,"PXRMFDA")
|
---|
27 | Q
|
---|
28 | ;
|
---|
29 | COPY(IENO) ;Copy patient list
|
---|
30 | ;Check if OK to copy
|
---|
31 | D ASK(IENO,"Copy") Q:$D(DUOUT)!$D(DTOUT)
|
---|
32 | N FDA,IENN,IND,MSG,NNAME,ODATA,OEPIEN,ONAME,ORULE,PATCREAT,TEXT,X,Y
|
---|
33 | ;Select list to copy to
|
---|
34 | S TEXT="Select PATIENT LIST name to copy to: "
|
---|
35 | D PLIST^PXRMLCR(.IENN,TEXT,IENO) Q:$D(DUOUT)!$D(DTOUT) Q:'IENN
|
---|
36 | S NNAME=$P($G(^PXRMXP(810.5,IENN,0)),U)
|
---|
37 | ;
|
---|
38 | ;Get original Patient List record
|
---|
39 | S ODATA=$G(^PXRMXP(810.5,IENO,0))
|
---|
40 | S ONAME=$P(ODATA,U),OEPIEN=$P(ODATA,U,5),ORULE=$P(ODATA,U,6)
|
---|
41 | ;
|
---|
42 | M ^PXRMXP(810.5,IENN)=^PXRMXP(810.5,IENO)
|
---|
43 | D ASK^PXRMXD(.PATCREAT,"Secure list?: ",2)
|
---|
44 | ;Update header info
|
---|
45 | S TYPE=$S($G(PATCREAT)="Y":"PVT",1:"PUB")
|
---|
46 | S IND=IENN_","
|
---|
47 | S FDA(810.5,IND,.01)=NNAME
|
---|
48 | S FDA(810.5,IND,.04)=$$NOW^XLFDT
|
---|
49 | S FDA(810.5,IND,.05)=OEPIEN
|
---|
50 | S FDA(810.5,IND,.06)=ORULE
|
---|
51 | S FDA(810.5,IND,.07)=$G(DUZ)
|
---|
52 | S FDA(810.5,IND,.08)=TYPE
|
---|
53 | D UPDATE^DIE("","FDA","","MSG")
|
---|
54 | ;Error
|
---|
55 | I $D(MSG) D ERR
|
---|
56 | ;
|
---|
57 | W !!,"Completed copy of '"_ONAME_"'"
|
---|
58 | W !,"into '"_NNAME_"'",! H 2
|
---|
59 | K ^TMP($J,"PXRMRULE")
|
---|
60 | Q
|
---|
61 | ;
|
---|
62 | CRLST(NAME,CLASS) ;Create new patient list
|
---|
63 | N IEN
|
---|
64 | ;Check if name exists
|
---|
65 | S IEN=$O(^PXRMXP(810.5,"B",NAME,"")) I IEN Q IEN
|
---|
66 | ;Otherwise create national entry
|
---|
67 | N FDA,FDAIEN,MSG
|
---|
68 | S FDA(810.5,"+1,",.01)=NAME
|
---|
69 | S FDA(810.5,"+1,",100)=CLASS
|
---|
70 | D UPDATE^DIE("","FDA","FDAIEN","MSG")
|
---|
71 | ;Error
|
---|
72 | I $D(MSG) Q 0
|
---|
73 | ;Otherwise list ien
|
---|
74 | Q FDAIEN(1)
|
---|
75 | ;
|
---|
76 | DELETE(LIST) ;Delete Patient list
|
---|
77 | I '$$VEDIT^PXRMUTIL("^PXRMXP(810.5,",LIST) D Q
|
---|
78 | .W !!,?5,"VA- and national class patient lists may not be deleted" H 2
|
---|
79 | .S DUOUT=1
|
---|
80 | ;Check if this is the right list
|
---|
81 | D ASK(LIST,"Delete") Q:$D(DUOUT)!$D(DTOUT)
|
---|
82 | ;
|
---|
83 | N DA,DIK,DUOUT
|
---|
84 | ;Lock patient list
|
---|
85 | D LOCK Q:$D(DUOUT)
|
---|
86 | ;Kill List
|
---|
87 | S DA=LIST,DIK="^PXRMXP(810.5,"
|
---|
88 | D ^DIK
|
---|
89 | ;Unlock patient list
|
---|
90 | D UNLOCK
|
---|
91 | Q
|
---|
92 | ;
|
---|
93 | ERR ;Error Handler
|
---|
94 | N ERROR,IC,REF
|
---|
95 | S ERROR(1)="Unable to build patient list : "
|
---|
96 | S ERROR(2)=NAME
|
---|
97 | S ERROR(3)="Error in UPDATE^DIE, needs further investigation"
|
---|
98 | ; Move MSG into Error
|
---|
99 | S REF="MSG"
|
---|
100 | F IC=4:1 S REF=$Q(@REF) Q:REF="" S ERROR(IC)=REF_"="_@REF
|
---|
101 | ;Screen message
|
---|
102 | D EN^DDIOL(.ERROR)
|
---|
103 | Q
|
---|
104 | ;
|
---|
105 | INTR ;Input transform for #810.4 fields
|
---|
106 | Q
|
---|
107 | ;
|
---|
108 | LOAD(NODE,LIEN) ;Load Patient List
|
---|
109 | N DATA,DFN,SUB
|
---|
110 | S SUB=0
|
---|
111 | F S SUB=$O(^PXRMXP(810.5,LIEN,30,SUB)) Q:'SUB D
|
---|
112 | .S DATA=$G(^PXRMXP(810.5,LIEN,30,SUB,0)),DFN=$P(DATA,U) Q:'DFN
|
---|
113 | .;Store the patient IEN and institution in ^TMP
|
---|
114 | .S ^TMP($J,NODE,DFN)=$P(DATA,U,2)_U_$P($G(DATA),U,3)_U_$P($G(DATA),U,4)
|
---|
115 | Q
|
---|
116 | ;
|
---|
117 | LOCK L +^PXRMXP(810.5,LIST):0
|
---|
118 | E W !!?5,"Another user is using this patient list" S DUOUT=1
|
---|
119 | Q
|
---|
120 | ;
|
---|
121 | PATS(LIST) ;Process Patient List finding rule
|
---|
122 | ;
|
---|
123 | N LIEN,LUVALUE
|
---|
124 | ;Insert year and period into extract list name
|
---|
125 | I YEAR]"",LIST["yyyy" S LIST=$P(LIST,"yyyy")_YEAR_$P(LIST,"yyyy",2)
|
---|
126 | I PERIOD]"",LIST["nn" S LIST=$P(LIST,"nn")_$E(PERIOD,2,10)_$P(LIST,"nn",2)
|
---|
127 | ;
|
---|
128 | S LUVALUE(1)=LIST
|
---|
129 | S LIEN=+$$FIND1^DIC(810.5,"","KUX",.LUVALUE) Q:'LIEN
|
---|
130 | ;
|
---|
131 | ;Add operation Load list
|
---|
132 | I FRACT="A" D LOAD(FROUT,LIEN) Q
|
---|
133 | ;
|
---|
134 | ;Remove, Select or Add Findings operations
|
---|
135 | I FRACT'="A" D Q
|
---|
136 | .;Load List
|
---|
137 | .D LOAD(PNODE,LIEN)
|
---|
138 | .;Check each patient
|
---|
139 | .S DFN=0
|
---|
140 | .F S DFN=$O(^TMP($J,FROUT,DFN)) Q:'DFN D
|
---|
141 | ..;Delete any ^TMP patient in PLIST if action is remove
|
---|
142 | ..I FRACT="R",$D(^TMP($J,PNODE,DFN)) K ^TMP($J,FROUT,DFN) Q
|
---|
143 | ..;Delete any ^TMP patient not in PLIST if action is select
|
---|
144 | ..I FRACT="S",'$D(^TMP($J,PNODE,DFN)) K ^TMP($J,FROUT,DFN)
|
---|
145 | Q
|
---|
146 | ;
|
---|
147 | START(RULESET,LIST,NODE,LBBDT,LBEDT,PAR,YEAR,PERIOD,INDP,INTP) ;
|
---|
148 | ;Process rule set
|
---|
149 | ;Clear ^TMP
|
---|
150 | D CLEAR(RULESET,NODE)
|
---|
151 | ;
|
---|
152 | N CLASS,FRACT,FRDATA,FRDATES,FRIEN,FRLST,FRLIEN,FROLST,FROUT,FRPAT
|
---|
153 | N FRPERM,FRSTRT,FRTIEN,FRTYP,FSEQ,INC,INST,PXRMDATE
|
---|
154 | N RBDT,REDT,RRIEN,RSDATA,RSDATES,SEQ,SUB
|
---|
155 | ;Get class from extract parameter
|
---|
156 | I PAR S CLASS=$P($G(^PXRM(810.2,PAR,100)),U)
|
---|
157 | ;Otherwise default to local
|
---|
158 | I $G(CLASS)="" S CLASS="L"
|
---|
159 | ;Get each finding rule in sequence
|
---|
160 | S SEQ="",INC=0
|
---|
161 | F S SEQ=$O(^PXRM(810.4,RULESET,30,"B",SEQ)) Q:'SEQ D
|
---|
162 | .;Save first sequence as default
|
---|
163 | .I INC=0 S INC=1,FSEQ=SEQ
|
---|
164 | .S SUB=$O(^PXRM(810.4,RULESET,30,"B",SEQ,"")) Q:'SUB
|
---|
165 | .S RSDATA=$G(^PXRM(810.4,RULESET,30,SUB,0)) Q:RSDATA=""
|
---|
166 | .S RSDATES=$G(^PXRM(810.4,RULESET,30,SUB,1))
|
---|
167 | .;Finding rule ien and action
|
---|
168 | .S FRIEN=$P(RSDATA,U,2),FRACT=$P(RSDATA,U,3) Q:'FRIEN Q:FRACT=""
|
---|
169 | .;Check if entry is a finding rule (not a set or reminder rule)
|
---|
170 | .S FRDATA=$G(^PXRM(810.4,FRIEN,0)),FRTYP=$P(FRDATA,U,3) Q:FRTYP=3
|
---|
171 | .S FRDATES=$P(FRDATA,U,4,5)
|
---|
172 | .;Get term IEN for finding rule
|
---|
173 | .I FRTYP=1 S FRTIEN=$P(FRDATA,U,7) Q:'FRTIEN
|
---|
174 | .;Get Reminder definition IEN for Reminder rule
|
---|
175 | .I FRTYP=2 S RRIEN=$P(FRDATA,U,10) Q:'RRIEN
|
---|
176 | .;Get Extract Patient List name for patient list rule
|
---|
177 | .I FRTYP=5 S FRLST=$P($G(^PXRM(810.4,FRIEN,1)),U) D Q:FRLST=""
|
---|
178 | ..S FROLST=$P(FRDATA,U,8)
|
---|
179 | ..I +FROLST>0 S FRLST=$P($G(^PXRMXP(810.5,FROLST,0)),U)
|
---|
180 | .;Determine RBDT and REDT
|
---|
181 | .D RDATES^PXRMEUT1(RSDATES,FRDATES,LBBDT,LBEDT,.RBDT,.REDT)
|
---|
182 | .S PXRMDATE=LBEDT
|
---|
183 | .;Get start sequence or start patient list
|
---|
184 | .S FRSTRT=$P(RSDATA,U,4),FRPAT=$P(RSDATA,U,5)
|
---|
185 | .;If sequence is defined use it
|
---|
186 | .I FRSTRT S FROUT=NODE_FRSTRT
|
---|
187 | .;If neither exist use first as default
|
---|
188 | .I FRSTRT="",FRPAT="" S FROUT=NODE_FSEQ
|
---|
189 | .;If start is patient list load patient list into workfile
|
---|
190 | .I FRSTRT="",FRPAT]"" S FROUT=NODE_SEQ D LOAD(FROUT,FRPAT)
|
---|
191 | .;Name of permanent list
|
---|
192 | .S FRPERM=$P(RSDATA,U,6)
|
---|
193 | .;
|
---|
194 | .;Build patient list in TMP
|
---|
195 | .N DFN,PNODE,TLIST
|
---|
196 | .S PNODE="PXRMEVAL"
|
---|
197 | .K ^TMP($J,PNODE)
|
---|
198 | .;Term finding rules
|
---|
199 | .I FRTYP=1 D TERM^PXRMRUL1(FRACT,FRTIEN,RBDT,REDT,PNODE,.INST)
|
---|
200 | .;Reminder Definition List Rule
|
---|
201 | .I FRTYP=2 D REM^PXRMRUL1(FRACT,RRIEN,RBDT,REDT,PNODE)
|
---|
202 | .;Patient list finding rules
|
---|
203 | .I FRTYP=5 D PATS(FRLST)
|
---|
204 | .;Clear results file
|
---|
205 | .K ^TMP($J,PNODE)
|
---|
206 | .;
|
---|
207 | .;Build permanent list if required
|
---|
208 | .I FRPERM]"" D
|
---|
209 | ..N FRPIEN
|
---|
210 | ..;Get patient list IEN or create new patient list
|
---|
211 | ..S FRPIEN=$$CRLST(FRPERM,CLASS) Q:'FRPIEN
|
---|
212 | ..;Update patient list
|
---|
213 | ..D UPDLST(FROUT,FRPIEN,PAR,RULESET,INST)
|
---|
214 | ;
|
---|
215 | ;Save final results to patient list
|
---|
216 | I LIST'="",FROUT'="" D
|
---|
217 | . D RMPAT^PXRMEUT(FROUT,INDP,INTP)
|
---|
218 | . D UPDLST(FROUT,LIST,PAR,RULESET,INST)
|
---|
219 | . D DOCUMENT^PXRMEUT(LIST,RULESET,INDP,INTP,LBBDT,LBEDT)
|
---|
220 | Q
|
---|
221 | ;
|
---|
222 | UPDLST(NODE,LIST,EPIEN,RULE,INST) ;Update patient list
|
---|
223 | N CNT,DA,DATA,DCNT,DFN,DNAME,DNAMEL,DUE,DUOUT,FDA,INST,INSTNAM,INSTNUM
|
---|
224 | N LAST,MSG,NAME,ONODE,RCNT,RIEN,RNAMEL,RNCNT,SUB,TEMP,TYPE,VALUE
|
---|
225 | ;Lock patient list
|
---|
226 | D LOCK Q:$D(DUOUT)
|
---|
227 | ;
|
---|
228 | ;Clear existing list.
|
---|
229 | K ^PXRMXP(810.5,LIST,30),^PXRMXP(810.5,LIST,35),^PXRMXP(810.5,LIST,45),^PXRMXP(810.5,LIST,200)
|
---|
230 | S NAME=$P($G(^PXRMXP(810.5,LIST,0)),U)
|
---|
231 | ;
|
---|
232 | ;Merge ^TMP into Patient List
|
---|
233 | S (CNT,DFN,INST)=0
|
---|
234 | F S DFN=$O(^TMP($J,NODE,DFN)) Q:'DFN D
|
---|
235 | .S ONODE=$G(^TMP($J,NODE,DFN,"INST"))
|
---|
236 | .S INSTNUM=$P(ONODE,U,1),INSTNAM=$P(ONODE,U,2)
|
---|
237 | .S CNT=CNT+1,^PXRMXP(810.5,LIST,30,CNT,0)=DFN_U_INSTNUM_U_INSTNAM
|
---|
238 | .S ^PXRMXP(810.5,LIST,30,"B",DFN,CNT)=""
|
---|
239 | .;
|
---|
240 | .;Save the reminder evaluation information only from Reports
|
---|
241 | .I $D(^TMP($J,NODE,DFN,"REM"))>0 D
|
---|
242 | ..S (RIEN,RCNT,RNCNT)=0
|
---|
243 | ..F S RIEN=$O(^TMP($J,NODE,DFN,"REM",RIEN)) Q:RIEN'>0 D
|
---|
244 | ...S RNAMEL(RIEN)=""
|
---|
245 | ...S VALUE=^TMP($J,NODE,DFN,"REM",RIEN)
|
---|
246 | ...S RCNT=RCNT+1
|
---|
247 | ...S ^PXRMXP(810.5,LIST,30,CNT,"REM",RCNT,0)=VALUE
|
---|
248 | ...S ^PXRMXP(810.5,LIST,30,CNT,"REM","B",RIEN,RCNT)=""
|
---|
249 | ..S ^PXRMXP(810.5,LIST,30,CNT,1,0)=U_"810.532A"_U_RCNT_U_RCNT
|
---|
250 | .;
|
---|
251 | .I '$D(^TMP($J,NODE,DFN,"DATA")) Q
|
---|
252 | .S DCNT=0,DNAME=""
|
---|
253 | .F S DNAME=$O(^TMP($J,NODE,DFN,"DATA",DNAME)) Q:DNAME="" D
|
---|
254 | ..S DNAMEL(DNAME)=""
|
---|
255 | ..S VALUE=^TMP($J,NODE,DFN,"DATA",DNAME)
|
---|
256 | ..S DCNT=DCNT+1
|
---|
257 | ..S ^PXRMXP(810.5,LIST,30,CNT,"DATA",DCNT,0)=DNAME_U_VALUE
|
---|
258 | ..S ^PXRMXP(810.5,LIST,30,CNT,"DATA","B",DNAME,DCNT)=""
|
---|
259 | .S ^PXRMXP(810.5,LIST,30,CNT,1,0)=U_"810.531A"_U_DCNT_U_DCNT
|
---|
260 | S ^PXRMXP(810.5,LIST,30,0)=U_"810.53P"_U_CNT_U_CNT
|
---|
261 | ;
|
---|
262 | ;Save the reminder information
|
---|
263 | S RNCNT=0,RIEN=0
|
---|
264 | F S RIEN=$O(RNAMEL(RIEN)) Q:RIEN'>0 D
|
---|
265 | .S RNCNT=RNCNT+1
|
---|
266 | .S ^PXRMXP(810.5,LIST,45,RCNT,0)=RIEN
|
---|
267 | .S ^PXRMXP(810.5,LIST,45,"B",RIEN,RNCNT)=""
|
---|
268 | I RNCNT>0 S ^PXRMXP(810.5,LIST,45,0)=U_"810.545P"_U_RNCNT_U_RNCNT
|
---|
269 | ;
|
---|
270 | ;Save the data types.
|
---|
271 | S DCNT=0,DNAME=""
|
---|
272 | F S DNAME=$O(DNAMEL(DNAME)) Q:DNAME="" D
|
---|
273 | .S DCNT=DCNT+1
|
---|
274 | .S ^PXRMXP(810.5,LIST,35,DCNT,0)=DNAME
|
---|
275 | .S ^PXRMXP(810.5,LIST,35,"B",DNAME,DCNT)=""
|
---|
276 | I DCNT>0 S ^PXRMXP(810.5,LIST,35,0)=U_"810.535A"_U_DCNT_U_DCNT
|
---|
277 | S ^PXRMXP(810.5,LIST,30,0)=U_"810.53P"_U_CNT_U_CNT
|
---|
278 | ;
|
---|
279 | ;Update header info
|
---|
280 | S TYPE=$S($G(PATCREAT)="Y":"PVT",1:"PUB")
|
---|
281 | K PATCREAT
|
---|
282 | S FDA(810.5,"?+1,",.01)=NAME
|
---|
283 | S FDA(810.5,"?+1,",.04)=$$NOW^XLFDT
|
---|
284 | S FDA(810.5,"?+1,",.05)=EPIEN
|
---|
285 | S FDA(810.5,"?+1,",.06)=RULE
|
---|
286 | S FDA(810.5,"?+1,",.07)=$G(DUZ)
|
---|
287 | S FDA(810.5,"?+1,",.08)=TYPE
|
---|
288 | I $G(INST)=1 S FDA(810.5,"?+1,",.1)=1
|
---|
289 | S FDA(810.5,"?+1,",50)=$S($G(PLISTPUG)="Y":1,1:0)
|
---|
290 | D UPDATE^DIE("","FDA","","MSG")
|
---|
291 | ;Error
|
---|
292 | I $D(MSG) D ERR
|
---|
293 | ;Unlock patient list
|
---|
294 | D UNLOCK
|
---|
295 | Q
|
---|
296 | ;
|
---|
297 | UNLOCK L -^PXRMXP(810.5,LIST) Q
|
---|
298 | ;
|
---|