source: WorldVistAEHR/trunk/r/CLINICAL_REMINDERS-PXRM/PXRM.m@ 1361

Last change on this file since 1361 was 613, checked in by George Lilly, 15 years ago

initial load of WorldVistAEHR

File size: 7.7 KB
Line 
1PXRM ; 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 ;==========================================================
5MAIN(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 ;==========================================================
48EVAL(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 ;
144OUTPUT ;Prepare the final output.
145 D OUTPUT^PXRMOUTD(OUTTYPE,.DEFARR,.PXRMPDEM,PCLOGIC,RESLOGIC,DUE,DUEDATE,RESDATE,FREQ,.FIEVAL)
146 ;
147EXIT ;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 ;==========================================================
161FIDATA(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 ;==========================================================
197INACTIVE(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 ;
Note: See TracBrowser for help on using the repository browser.