1 | PXRMRULE ; SLC/PJH - Build Patient list from Rule Set ;03/27/2007
|
---|
2 | ;;2.0;CLINICAL REMINDERS;**4,6**;Feb 04, 2005;Build 123
|
---|
3 | ;
|
---|
4 | ; Called from PXRM PATIENT LIST CREATE protocol
|
---|
5 | ;
|
---|
6 | CLEAR(RULE,NODE) ;Clear workfile entries
|
---|
7 | N SEQ
|
---|
8 | S SEQ=""
|
---|
9 | F S SEQ=$O(^PXRM(810.4,RULE,30,"B",SEQ)) Q:'SEQ D
|
---|
10 | .K ^TMP($J,NODE_SEQ)
|
---|
11 | ;clear FDA array
|
---|
12 | K ^TMP($J,"PXRMFDA")
|
---|
13 | Q
|
---|
14 | ;
|
---|
15 | INTR ;Input transform for #810.4 fields
|
---|
16 | Q
|
---|
17 | ;
|
---|
18 | LOAD(NODE,LIEN) ;Load Patient List
|
---|
19 | N DATA,DFN,SUB
|
---|
20 | S SUB=0
|
---|
21 | F S SUB=$O(^PXRMXP(810.5,LIEN,30,SUB)) Q:'SUB D
|
---|
22 | .S DATA=$G(^PXRMXP(810.5,LIEN,30,SUB,0)),DFN=$P(DATA,U) Q:'DFN
|
---|
23 | .;Store the patient IEN and institution in ^TMP
|
---|
24 | .S ^TMP($J,NODE,DFN)=$P(DATA,U,2)_U_$P($G(DATA),U,3)_U_$P($G(DATA),U,4)
|
---|
25 | Q
|
---|
26 | ;
|
---|
27 | PATS(FRACT,FROUT,PNODE,LIST) ;Process Patient List finding rule
|
---|
28 | ;
|
---|
29 | N LIEN,LUVALUE
|
---|
30 | ;Insert year and period into extract list name
|
---|
31 | I YEAR]"",LIST["yyyy" S LIST=$P(LIST,"yyyy")_YEAR_$P(LIST,"yyyy",2)
|
---|
32 | I PERIOD]"",LIST["nn" S LIST=$P(LIST,"nn")_$E(PERIOD,2,10)_$P(LIST,"nn",2)
|
---|
33 | ;
|
---|
34 | S LUVALUE(1)=LIST
|
---|
35 | S LIEN=+$$FIND1^DIC(810.5,"","KUX",.LUVALUE) Q:'LIEN
|
---|
36 | ;
|
---|
37 | ;Add operation Load list
|
---|
38 | I FRACT="A" D LOAD(FROUT,LIEN) Q
|
---|
39 | ;
|
---|
40 | ;Remove or Select operations
|
---|
41 | ;Load List
|
---|
42 | D LOAD(PNODE,LIEN)
|
---|
43 | ;Check each patient
|
---|
44 | S DFN=0
|
---|
45 | F S DFN=$O(^TMP($J,FROUT,DFN)) Q:'DFN D
|
---|
46 | .;Delete any ^TMP patient in PLIST if action is remove
|
---|
47 | .I FRACT="R",$D(^TMP($J,PNODE,DFN)) K ^TMP($J,FROUT,DFN) Q
|
---|
48 | .;Delete any ^TMP patient not in PLIST if action is select
|
---|
49 | .I FRACT="S",'$D(^TMP($J,PNODE,DFN)) K ^TMP($J,FROUT,DFN)
|
---|
50 | Q
|
---|
51 | ;
|
---|
52 | START(RULESET,LIST,NODE,LBBDT,LBEDT,PAR,YEAR,PERIOD,INDP,INTP,EXTITR) ;
|
---|
53 | ;Process rule set
|
---|
54 | ;Clear ^TMP
|
---|
55 | D CLEAR(RULESET,NODE)
|
---|
56 | ;
|
---|
57 | N CLASS,FRACT,FRDATA,FRDATES,FRIEN,FRLST,FRLIEN,FROLST,FROUT,FRPAT
|
---|
58 | N FRPERM,FRSTRT,FRTIEN,FRTYP,FSEQ,INC,INST,PXRMDATE,PXRMDDOC
|
---|
59 | N RBDT,REDT,RRIEN,RSDATA,RSDATES,SEQ,SUB
|
---|
60 | ;Get class from extract parameter
|
---|
61 | I PAR S CLASS=$P($G(^PXRM(810.2,PAR,100)),U)
|
---|
62 | ;Otherwise default to local
|
---|
63 | I $G(CLASS)="" S CLASS="L"
|
---|
64 | ;PXRMDDOC=1 save list rule evaluation dates in ^TMP("PXRMDDOC",$J)
|
---|
65 | S PXRMDDOC=1
|
---|
66 | K ^TMP("PXRMDDOC",$J)
|
---|
67 | ;Get each finding rule in sequence
|
---|
68 | S SEQ="",INC=0,INST=0
|
---|
69 | F S SEQ=$O(^PXRM(810.4,RULESET,30,"B",SEQ)) Q:'SEQ D
|
---|
70 | .;Save first sequence as default
|
---|
71 | .I INC=0 S INC=1,FSEQ=SEQ
|
---|
72 | .S SUB=$O(^PXRM(810.4,RULESET,30,"B",SEQ,"")) Q:'SUB
|
---|
73 | .S RSDATA=$G(^PXRM(810.4,RULESET,30,SUB,0)) Q:RSDATA=""
|
---|
74 | .S RSDATES=$G(^PXRM(810.4,RULESET,30,SUB,1))
|
---|
75 | .;Finding rule ien and action
|
---|
76 | .S FRIEN=$P(RSDATA,U,2),FRACT=$P(RSDATA,U,3) Q:'FRIEN Q:FRACT=""
|
---|
77 | .;Check if entry is a finding rule (not a set or reminder rule)
|
---|
78 | .S FRDATA=$G(^PXRM(810.4,FRIEN,0)),FRTYP=$P(FRDATA,U,3) Q:FRTYP=3
|
---|
79 | .S FRDATES=$P(FRDATA,U,4,5)
|
---|
80 | .;Get term IEN for finding rule
|
---|
81 | .I FRTYP=1 S FRTIEN=$P(FRDATA,U,7) Q:'FRTIEN
|
---|
82 | .;Get Reminder definition IEN for Reminder rule
|
---|
83 | .I FRTYP=2 S RRIEN=$P(FRDATA,U,10) Q:'RRIEN
|
---|
84 | .;Get Extract Patient List name for patient list rule
|
---|
85 | .I FRTYP=5 S FRLST=$P($G(^PXRM(810.4,FRIEN,1)),U) D Q:FRLST=""
|
---|
86 | ..I +EXTITR>0 S FRLST=FRLST_"/"_EXTITR
|
---|
87 | ..S FROLST=$P(FRDATA,U,8)
|
---|
88 | ..I +FROLST>0 S FRLST=$P($G(^PXRMXP(810.5,FROLST,0)),U)
|
---|
89 | .;Determine RBDT and REDT
|
---|
90 | .D RDATES^PXRMEUT1(RSDATES,FRDATES,LBBDT,LBEDT,.RBDT,.REDT)
|
---|
91 | .S PXRMDATE=LBEDT
|
---|
92 | .;Get start sequence or start patient list
|
---|
93 | .S FRSTRT=$P(RSDATA,U,4),FRPAT=$P(RSDATA,U,5)
|
---|
94 | .;If sequence is defined use it
|
---|
95 | .I FRSTRT S FROUT=NODE_FRSTRT
|
---|
96 | .;If neither exist use first as default
|
---|
97 | .I FRSTRT="",FRPAT="" S FROUT=NODE_FSEQ
|
---|
98 | .;If start is patient list load patient list into workfile
|
---|
99 | .I FRSTRT="",FRPAT]"" S FROUT=NODE_SEQ D LOAD(FROUT,FRPAT)
|
---|
100 | .;Name of permanent list
|
---|
101 | .S FRPERM=$P(RSDATA,U,6)
|
---|
102 | .;
|
---|
103 | .;Build patient list in TMP
|
---|
104 | .N DFN,PNODE,TLIST
|
---|
105 | .S PNODE="PXRMEVAL"
|
---|
106 | .K ^TMP($J,PNODE)
|
---|
107 | .;Term finding rules
|
---|
108 | .I FRTYP=1 D TERM^PXRMRUL1(FRACT,FRTIEN,LBBDT,LBEDT,RBDT,REDT,PNODE,.INST)
|
---|
109 | .;Reminder Definition List Rule
|
---|
110 | .I FRTYP=2 D REM^PXRMRUL1(FRACT,RRIEN,LBBDT,LBEDT,RBDT,REDT,PNODE)
|
---|
111 | .;Patient list finding rules
|
---|
112 | .I FRTYP=5 D PATS(FRACT,FROUT,PNODE,FRLST)
|
---|
113 | .;Clear results file
|
---|
114 | .K ^TMP($J,PNODE)
|
---|
115 | .;
|
---|
116 | .;Build permanent list if required
|
---|
117 | .I FRPERM]"" D
|
---|
118 | ..N FRPIEN
|
---|
119 | ..;Get patient list IEN or create new patient list
|
---|
120 | ..S FRPIEN=$$CRLST^PXRMRUL1(FRPERM,CLASS) Q:'FRPIEN
|
---|
121 | ..;Update patient list
|
---|
122 | ..D UPDLST(FROUT,FRPIEN,PAR,RULESET,INST,INDP,INTP)
|
---|
123 | ;
|
---|
124 | ;Save final results to patient list
|
---|
125 | I LIST'="",FROUT'="" D
|
---|
126 | . D RMPAT^PXRMEUT(FROUT,INDP,INTP)
|
---|
127 | . D UPDLST(FROUT,LIST,PAR,RULESET,INST,INDP,INTP)
|
---|
128 | .;PXRMDDOC=2 compare saved dates with those generated in
|
---|
129 | .;DOCUMENT^PXRMEUT.
|
---|
130 | . S PXRMDDOC=2
|
---|
131 | . D DOCUMENT^PXRMEUT(LIST,RULESET,INDP,INTP,LBBDT,LBEDT)
|
---|
132 | K ^TMP("PXRMDDOC",$J)
|
---|
133 | Q
|
---|
134 | ;
|
---|
135 | UPDLST(NODE,LIST,EPIEN,RULE,INST,INDP,INTP) ;Update patient list
|
---|
136 | N CNT,DA,DATA,DCNT,DECEASED,DFN,DNAME,DNAMEL,DOD,DUE,DUOUT,FDA
|
---|
137 | N INSTNAM,INSTNUM,LAST,MSG,NAME,ONODE
|
---|
138 | N RCNT,RIEN,RNAMEL,RNCNT,SUB,TEMP,TEST,TYPE,VALUE
|
---|
139 | ;Lock patient list
|
---|
140 | D LOCK^PXRMRUL1 Q:$D(DUOUT)
|
---|
141 | S TEMP=^PXRMXP(810.5,LIST,0)
|
---|
142 | S NAME=$P(TEMP,U,1)
|
---|
143 | S $P(^PXRMXP(810.5,LIST,0),U,11)=INDP
|
---|
144 | S $P(^PXRMXP(810.5,LIST,0),U,12)=INTP
|
---|
145 | ;
|
---|
146 | ;Clear existing list.
|
---|
147 | K ^PXRMXP(810.5,LIST,30),^PXRMXP(810.5,LIST,35),^PXRMXP(810.5,LIST,45),^PXRMXP(810.5,LIST,200)
|
---|
148 | ;
|
---|
149 | ;Merge ^TMP into Patient List
|
---|
150 | S (DECEASED,TESTP)=""
|
---|
151 | S (CNT,DFN)=0
|
---|
152 | F S DFN=$O(^TMP($J,NODE,DFN)) Q:'DFN D
|
---|
153 | .S ONODE=$G(^TMP($J,NODE,DFN,"INST"))
|
---|
154 | .S INSTNUM=$P(ONODE,U,1),INSTNAM=$P(ONODE,U,2)
|
---|
155 | .S TEMP=DFN_U_INSTNUM_U_INSTNAM
|
---|
156 | .I INDP D
|
---|
157 | ..;DBIA #10035
|
---|
158 | ..S DOD=+$P($G(^DPT(DFN,.35)),U,1)
|
---|
159 | ..S DECEASED=$S(DOD=0:0,1:1)
|
---|
160 | .;DBIA #3744
|
---|
161 | .I INTP S TESTP=$$TESTPAT^VADPT(DFN)
|
---|
162 | .S CNT=CNT+1,^PXRMXP(810.5,LIST,30,CNT,0)=DFN_U_INSTNUM_U_INSTNAM_U_DECEASED_U_TESTP
|
---|
163 | .S ^PXRMXP(810.5,LIST,30,"B",DFN,CNT)=""
|
---|
164 | .;
|
---|
165 | .;Save the reminder evaluation information only from Reports
|
---|
166 | .I $D(^TMP($J,NODE,DFN,"REM"))>0 D
|
---|
167 | ..S (RIEN,RCNT,RNCNT)=0
|
---|
168 | ..F S RIEN=$O(^TMP($J,NODE,DFN,"REM",RIEN)) Q:RIEN'>0 D
|
---|
169 | ...S RNAMEL(RIEN)=""
|
---|
170 | ...S VALUE=^TMP($J,NODE,DFN,"REM",RIEN)
|
---|
171 | ...S RCNT=RCNT+1
|
---|
172 | ...S ^PXRMXP(810.5,LIST,30,CNT,"REM",RCNT,0)=VALUE
|
---|
173 | ...S ^PXRMXP(810.5,LIST,30,CNT,"REM","B",RIEN,RCNT)=""
|
---|
174 | ..S ^PXRMXP(810.5,LIST,30,CNT,1,0)=U_"810.532A"_U_RCNT_U_RCNT
|
---|
175 | .;
|
---|
176 | .I '$D(^TMP($J,NODE,DFN,"DATA")) Q
|
---|
177 | .S DCNT=0,DNAME=""
|
---|
178 | .F S DNAME=$O(^TMP($J,NODE,DFN,"DATA",DNAME)) Q:DNAME="" D
|
---|
179 | ..S DNAMEL(DNAME)=""
|
---|
180 | ..S VALUE=^TMP($J,NODE,DFN,"DATA",DNAME)
|
---|
181 | ..S DCNT=DCNT+1
|
---|
182 | ..S ^PXRMXP(810.5,LIST,30,CNT,"DATA",DCNT,0)=DNAME_U_VALUE
|
---|
183 | ..S ^PXRMXP(810.5,LIST,30,CNT,"DATA","B",DNAME,DCNT)=""
|
---|
184 | .S ^PXRMXP(810.5,LIST,30,CNT,1,0)=U_"810.531A"_U_DCNT_U_DCNT
|
---|
185 | S ^PXRMXP(810.5,LIST,30,0)=U_"810.53P"_U_CNT_U_CNT
|
---|
186 | ;
|
---|
187 | ;Save the reminder information
|
---|
188 | S RNCNT=0,RIEN=0
|
---|
189 | F S RIEN=$O(RNAMEL(RIEN)) Q:RIEN'>0 D
|
---|
190 | .S RNCNT=RNCNT+1
|
---|
191 | .S ^PXRMXP(810.5,LIST,45,RCNT,0)=RIEN
|
---|
192 | .S ^PXRMXP(810.5,LIST,45,"B",RIEN,RNCNT)=""
|
---|
193 | I RNCNT>0 S ^PXRMXP(810.5,LIST,45,0)=U_"810.545P"_U_RNCNT_U_RNCNT
|
---|
194 | ;
|
---|
195 | ;Save the data types.
|
---|
196 | S DCNT=0,DNAME=""
|
---|
197 | F S DNAME=$O(DNAMEL(DNAME)) Q:DNAME="" D
|
---|
198 | .S DCNT=DCNT+1
|
---|
199 | .S ^PXRMXP(810.5,LIST,35,DCNT,0)=DNAME
|
---|
200 | .S ^PXRMXP(810.5,LIST,35,"B",DNAME,DCNT)=""
|
---|
201 | I DCNT>0 S ^PXRMXP(810.5,LIST,35,0)=U_"810.535A"_U_DCNT_U_DCNT
|
---|
202 | S ^PXRMXP(810.5,LIST,30,0)=U_"810.53P"_U_CNT_U_CNT
|
---|
203 | ;
|
---|
204 | ;Update header info
|
---|
205 | S TYPE=$S($G(PATCREAT)="Y":"PVT",1:"PUB")
|
---|
206 | K PATCREAT
|
---|
207 | S FDA(810.5,"?+1,",.01)=NAME
|
---|
208 | S FDA(810.5,"?+1,",.04)=$$NOW^XLFDT
|
---|
209 | S FDA(810.5,"?+1,",.05)=EPIEN
|
---|
210 | S FDA(810.5,"?+1,",.06)=RULE
|
---|
211 | S FDA(810.5,"?+1,",.07)=$G(DUZ)
|
---|
212 | S FDA(810.5,"?+1,",.08)=TYPE
|
---|
213 | I $G(INST)=1 S FDA(810.5,"?+1,",.1)=1
|
---|
214 | S FDA(810.5,"?+1,",50)=$S($G(PLISTPUG)="Y":1,1:0)
|
---|
215 | D UPDATE^DIE("","FDA","","MSG")
|
---|
216 | ;Error
|
---|
217 | I $D(MSG) D ERR^PXRMRUL1
|
---|
218 | ;Unlock patient list
|
---|
219 | D UNLOCK^PXRMRUL1
|
---|
220 | Q
|
---|
221 | ;
|
---|