1 | PXRM ; SLC/PKR - Clinical Reminders entry points. ; 06/09/2006
|
---|
2 | ;;2.0;CLINICAL REMINDERS;**4**;Feb 04, 2005;Build 21
|
---|
3 | ;Entry points in this routine are listed in DBIA #2182.
|
---|
4 | ;==========================================================
|
---|
5 | MAIN(DFN,PXRMITEM,OUTTYPE,DISC) ;Main driver for clinical reminders.
|
---|
6 | ;INPUT DFN - Pointer to Patient File (#2)
|
---|
7 | ; PXRMITEM - IEN of reminder to evaluate.
|
---|
8 | ; OUTTYPE - Flag to indicate type of output information.
|
---|
9 | ; 0 - Reminders DUE NOW only (CLINICAL REMINDERS DUE
|
---|
10 | ; HS component)
|
---|
11 | ; 1 - All Reminders with Next and Last Information
|
---|
12 | ; (CLINICAL REMINDERS SUMMARY HS component)
|
---|
13 | ; 5 - Health Maintenance (CLINICAL REMINDERS MAINTENANCE
|
---|
14 | ; HS component)
|
---|
15 | ; 10 - MyHealtheVet summary
|
---|
16 | ; 11 - MyHealtheVet detailed
|
---|
17 | ; 12 - MyHealtheVet combined
|
---|
18 | ; DISC - (optional) if this is true then the disclaimer will
|
---|
19 | ; be loaded in ^TMP("PXRM",$J,"DISC").
|
---|
20 | ;
|
---|
21 | ;OUTPUT ^TMP("PXRHM",$J,PXRMITEM,PXRMRNAM)=
|
---|
22 | ; STATUS_U_DUE DATE_U_LAST DONE
|
---|
23 | ; where PXRMRNAM is the PRINT NAME or if it is undefined then
|
---|
24 | ; it is the NAME (.01).
|
---|
25 | ; For the Clinical Maintenance component, OUTTYPE=5, there is
|
---|
26 | ; subsequent output of the form
|
---|
27 | ; ^TMP("PXRHM",$J,PXRMITEM,PXRMRNAM,"TXT",N)=TEXT
|
---|
28 | ; where N is a number and TEXT is a text string.
|
---|
29 | ;
|
---|
30 | ; If DISC is true then the disclaimer will be loaded into
|
---|
31 | ; ^TMP("PXRM",$J,"DISC"). The calling application should
|
---|
32 | ; delete this when it is done.
|
---|
33 | ;
|
---|
34 | ; The calling application can display the contents of these
|
---|
35 | ; two ^TMP arrays as it chooses. The caller should also make
|
---|
36 | ; sure the ^TMP globals are killed before it exits.
|
---|
37 | ;
|
---|
38 | N DEFARR,FIEVAL
|
---|
39 | ;Load the definition into DEFARR.
|
---|
40 | D DEF^PXRMLDR(PXRMITEM,.DEFARR)
|
---|
41 | ;
|
---|
42 | I $G(NODISC)="" S NODISC=1
|
---|
43 | I $D(GMFLAG) S NODISC=0
|
---|
44 | D EVAL(DFN,.DEFARR,OUTTYPE,NODISC,.FIEVAL)
|
---|
45 | Q
|
---|
46 | ;
|
---|
47 | ;==========================================================
|
---|
48 | EVAL(DFN,DEFARR,OUTTYPE,NODISC,FIEVAL,DATE) ;Reminder evaluation entry
|
---|
49 | ;point. This entry point uses the local array DEFARR for the reminder
|
---|
50 | ;definition and returns the Finding Evaluation Array, FIEVAL.
|
---|
51 | ;PXRM namespaced variables are the reminder evaluation "global"
|
---|
52 | ;variables. If date is specified then the reminder will be evaluated
|
---|
53 | ;as if the current date is DATE.
|
---|
54 | N PXRMAGE,PXRMDATE,PXRMDOB,PXRMDOD,PXRMLAD,PXRMPDEM,PXRMPID,PXRMITEM
|
---|
55 | N PXRMRM,PXRMRNAM,PXRMSEX,PXRMXTLK
|
---|
56 | ;Make sure the reminder exists.
|
---|
57 | I $D(DEFARR("DNE")) D NODEF^PXRMERRH(DEFARR("IEN")) Q
|
---|
58 | ;PXRMRM is the right margin for output.
|
---|
59 | S PXRMRM=70
|
---|
60 | S PXRMDATE=$G(DATE)
|
---|
61 | S PXRMITEM=DEFARR("IEN")
|
---|
62 | S PXRMPID="PXRM"_PXRMITEM_$H
|
---|
63 | N D00
|
---|
64 | S D00=DEFARR(0)
|
---|
65 | S PXRMRNAM=$P(D00,U,3)
|
---|
66 | ;If the print name is null use the .01.
|
---|
67 | I PXRMRNAM="" S PXRMRNAM=$P(D00,U,1)
|
---|
68 | ;
|
---|
69 | ;Set the error handler to the PXRMERRH routine. Use the new style of
|
---|
70 | ;error trapping.
|
---|
71 | N $ES,$ET
|
---|
72 | S $ET="D ERRHDLR^PXRMERRH"
|
---|
73 | ;
|
---|
74 | ;Initialize the working array.
|
---|
75 | K ^TMP(PXRMPID,$J)
|
---|
76 | ;
|
---|
77 | N DUE,DUEDATE,FREQ,PCLOGIC,RESDATE,RESLOGIC
|
---|
78 | ;Make sure the reminder is active.
|
---|
79 | I $P(D00,U,6) D G OUTPUT
|
---|
80 | . S ^TMP(PXRMPID,$J,PXRMITEM,"N/A","INACTIVE")="The reminder "_PXRMRNAM_" was inactivated "_$$FMTE^XLFDT($P(D00,U,7),"5Z")
|
---|
81 | . S PXRMPDEM("DFN")=DFN,PCLOGIC=0,RESLOGIC="",DUE="",DUEDATE=0
|
---|
82 | . S RESDATE="",FREQ="0Y"
|
---|
83 | ;
|
---|
84 | ;Make sure the "E" node exists
|
---|
85 | I $D(DEFARR(20))&'$D(DEFARR("E")) D G EXIT
|
---|
86 | . W !,"Reminder definition is corrupted, ENODE is missing cannot continue!"
|
---|
87 | . S ^TMP("PXRHM",$J,PXRMITEM,PXRMRNAM)="ERROR"_U_"E NODE MISSING"
|
---|
88 | . S ^TMP(PXRMPID,$J,PXRMITEM,"FERROR","NO ENODE")=""
|
---|
89 | ;
|
---|
90 | ;Establish the main findings evaluation variables.
|
---|
91 | S (DUE,DUEDATE,FREQ,RESDATE)=0
|
---|
92 | S (PCLOGIC,RESLOGIC)=""
|
---|
93 | ;
|
---|
94 | ;Establish the patient demographic information.
|
---|
95 | N TODAY
|
---|
96 | S TODAY=$G(DATE,DT)
|
---|
97 | D DEM^PXRMPINF(DFN,TODAY,.PXRMPDEM)
|
---|
98 | I PXRMPDEM("PATIENT")="" D G EXIT
|
---|
99 | . S ^TMP(PXRMPID,$J,PXRMITEM,"FERROR","PATIENT","NO PAT")="DFN "_DFN_" IS NOT A VALID PATIENT"
|
---|
100 | . S PCLOGIC=0
|
---|
101 | ;
|
---|
102 | ;Load the local demographic variables for use in condition.
|
---|
103 | S PXRMAGE=PXRMPDEM("AGE"),PXRMDOB=PXRMPDEM("DOB"),PXRMDOD=PXRMPDEM("DOD")
|
---|
104 | S PXRMLAD=PXRMPDEM("LAD"),PXRMSEX=PXRMPDEM("SEX")
|
---|
105 | ;
|
---|
106 | ;Check for a date of death.
|
---|
107 | I PXRMPDEM("DOD")'="" D
|
---|
108 | . S ^TMP(PXRMPID,$J,PXRMITEM,"N/A","DEAD")=""
|
---|
109 | . S ^TMP(PXRMPID,$J,PXRMITEM,"DEAD")="Patient is deceased."
|
---|
110 | ;
|
---|
111 | ;If the component is CR and the patient is deceased we are done.
|
---|
112 | I OUTTYPE=0,PXRMPDEM("DOD")'="",'$G(PXRMIDOD) G OUTPUT
|
---|
113 | ;
|
---|
114 | ;Check for a sex specific reminder.
|
---|
115 | N SEXOK
|
---|
116 | S SEXOK=$$SEX^PXRMLOG(.DEFARR,PXRMPDEM("SEX"))
|
---|
117 | S FIEVAL("SEX")=SEXOK
|
---|
118 | ;If the patient is the wrong sex then don't do anything else.
|
---|
119 | I 'SEXOK D G OUTPUT
|
---|
120 | . S PCLOGIC=0
|
---|
121 | . S ^TMP(PXRMPID,$J,PXRMITEM,"N/A","SEX")=""
|
---|
122 | . S ^TMP(PXRMPID,$J,PXRMITEM,"INFO","SEX")="Patient is the wrong sex!"
|
---|
123 | ;
|
---|
124 | ;Evaluate the findings.
|
---|
125 | S PXRMXTLK=""
|
---|
126 | D EVAL^PXRMEVFI(DFN,.DEFARR,.FIEVAL)
|
---|
127 | I +PXRMXTLK>0 D G OUTPUT
|
---|
128 | . S ^TMP(PXRMPID,$J,PXRMITEM,"FERROR","EXPANDED TAXONOMY","NO LOCK")="NO LOCK for ien "_+PXRMXTLK
|
---|
129 | . S PCLOGIC=0
|
---|
130 | ;
|
---|
131 | ;Check for missing index.
|
---|
132 | I $D(^TMP(PXRMPID,$J,PXRMITEM,"WARNING","MISSING INDEX")) D G OUTPUT
|
---|
133 | . S (DUE,DUEDATE)="CNBD",PCLOGIC=1
|
---|
134 | ;
|
---|
135 | ;Evaluate the Patient Cohort Logic.
|
---|
136 | D EVALPCL^PXRMLOG(.DEFARR,.PXRMPDEM,.FREQ,.PCLOGIC,.FIEVAL)
|
---|
137 | ;
|
---|
138 | ;Evaluate the resolution logic and get the last resolution date.
|
---|
139 | D EVALRESL^PXRMLOG(.DEFARR,.RESDATE,.RESLOGIC,.FIEVAL)
|
---|
140 | ;
|
---|
141 | ;If the reminder is applicable calculate the due date.
|
---|
142 | I PCLOGIC D DUE^PXRMDATE(.DEFARR,RESDATE,FREQ,.DUE,.DUEDATE,.FIEVAL)
|
---|
143 | ;
|
---|
144 | OUTPUT ;Prepare the final output.
|
---|
145 | D OUTPUT^PXRMOUTD(OUTTYPE,.DEFARR,.PXRMPDEM,PCLOGIC,RESLOGIC,DUE,DUEDATE,RESDATE,FREQ,.FIEVAL)
|
---|
146 | ;
|
---|
147 | EXIT ;Kill the working arrays unless this was a test run.
|
---|
148 | I $G(PXRMDEBG) D
|
---|
149 | . S PXRMID=PXRMPID
|
---|
150 | . S FIEVAL("PATIENT AGE")=$G(PXRMPDEM("AGE"))
|
---|
151 | . S FIEVAL("DFN")=DFN
|
---|
152 | . S FIEVAL("EVAL DATE/TIME")=$$NOW^PXRMDATE
|
---|
153 | . S ^TMP(PXRMPID,$J,PXRMITEM,"REMINDER NAME")=$G(PXRMRNAM)
|
---|
154 | E K ^TMP(PXRMPID,$J)
|
---|
155 | ;
|
---|
156 | ;I DISC is true load the disclaimer.
|
---|
157 | I $G(DISC) D LOAD^PXRMDISC
|
---|
158 | Q
|
---|
159 | ;
|
---|
160 | ;==========================================================
|
---|
161 | FIDATA(DFN,PXRMITEM,FINDINGS) ;Return the finding evaluation array to the
|
---|
162 | ;caller in the array FINDINGS. The caller should use the form
|
---|
163 | ;D FIDATA^PXRM(DFN,PXRMITEM,.FINDINGS)
|
---|
164 | ;The elements of the FINDINGS array will correspond to the
|
---|
165 | ;findings in the reminder definition. For finding N FINDINGS(N)
|
---|
166 | ;will be 0 if the finding is false and 1 if it is true. For
|
---|
167 | ;true findings there will be additional elements. The exact set
|
---|
168 | ;of additional elements will depend of the type of finding.
|
---|
169 | ;Some typical examples are:
|
---|
170 | ;FINDINGS(N)=1
|
---|
171 | ;FINDINGS(N,"DATE")=FileMan date
|
---|
172 | ;FINDINGS(N,"FINDING")=variable pointer to the finding
|
---|
173 | ;FINDINGS(N,"FILE NUMBER")=file number of data source
|
---|
174 | ;FINDINGS(N,"VALUE")=value of the finding, for example the
|
---|
175 | ; value of a lab test
|
---|
176 | ;
|
---|
177 | N DEFARR,FI,FIEVAL
|
---|
178 | ;Load the definition into DEFARR.
|
---|
179 | D DEF^PXRMLDR(PXRMITEM,.DEFARR)
|
---|
180 | D EVAL(DFN,.DEFARR,0,1,.FIEVAL)
|
---|
181 | K ^TMP("PXRM",$J),^TMP("PXRHM",$J)
|
---|
182 | ;Load the FINDINGS array.
|
---|
183 | S FI=0
|
---|
184 | F S FI=+$O(FIEVAL(FI)) Q:FI=0 D
|
---|
185 | . S FINDINGS(FI)=FIEVAL(FI)
|
---|
186 | . I 'FIEVAL(FI) Q
|
---|
187 | . S FINDINGS(FI,"DATE")=FIEVAL(FI,"DATE")
|
---|
188 | . I FIEVAL(FI,"FINDING")["PSDRUG" S FINDINGS(FI,"DRUG")=1
|
---|
189 | . S FINDINGS(FI,"FILE NUMBER")=FIEVAL(FI,"FILE NUMBER")
|
---|
190 | . S FINDINGS(FI,"FINDING")=FIEVAL(FI,"FINDING")
|
---|
191 | . I $D(FIEVAL(FI,"TERM")) S FINDINGS(FI,"TERM")=FIEVAL(FI,"TERM")
|
---|
192 | . I $D(FIEVAL(FI,"VALUE")) S (FINDINGS(FI,"RESULT"),FINDINGS(FI,"VALUE"))=FIEVAL(FI,"VALUE")
|
---|
193 | . I $D(FIEVAL(FI,"VISIT")) S FINDINGS(FI,"VIEN")=FIEVAL(FI,"VISIT")
|
---|
194 | Q
|
---|
195 | ;
|
---|
196 | ;==========================================================
|
---|
197 | INACTIVE(PXRMITEM) ;Return the INACTIVE FLAG, which has a value of 1
|
---|
198 | ;if the reminder is inactive.
|
---|
199 | I '$D(^PXD(811.9,PXRMITEM)) Q 1
|
---|
200 | Q $P(^PXD(811.9,PXRMITEM,0),U,6)
|
---|
201 | ;
|
---|