source: FOIAVistA/trunk/r/CLINICAL_REMINDERS-PXRM/PXRMMST.m@ 1684

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

initial load of FOIAVistA 6/30/08 version

File size: 9.1 KB
Line 
1PXRMMST ; SLC/PKR - Routines for dealing with MST. ;03/29/2007
2 ;;2.0;CLINICAL REMINDERS;**4,6**;Feb 04, 2005;Build 123
3 ;Use of DGMSTAPI supported by DBIA #2716.
4 ;====================================================
5GSYINFO(TYPE) ;Return the Clinical Reminders MST synchronization date
6 ;and the number of updates made. The format is an up-arrow delimited
7 ;string. The first piece is the date and the second is the number
8 ;of updates. If TYPE is "I" then the data for the initial
9 ;synchronization is returned. For any other value the data for the
10 ;last daily synchronization is returned.
11 I $G(TYPE)="I" Q $P($G(^PXRM(800,1,"MST")),U,1,2) Q
12 Q $P($G(^PXRM(800,1,"MST")),U,3,4)
13 ;
14 ;====================================================
15QUE ;Queue the MST synchronization job.
16 N DIR,DIROUT,DIRUT,DTOUT,DUOUT,MINDT,SDTIME,STIME,X,Y
17 S MINDT=$$NOW^XLFDT
18 W !,"Queue the Clinical Reminders MST synchronization."
19 S DIR("A",1)="Enter the date and time you want the job to start."
20 S DIR("A",2)="It must be after "_$$FMTE^XLFDT(MINDT,"5Z")
21 S DIR("A")="Start the task at: "
22 S DIR(0)="DAU"_U_MINDT_"::RSX"
23 D ^DIR
24 I $D(DIROUT)!$D(DIRUT) Q
25 I $D(DTOUT)!$D(DUOUT) Q
26 S SDTIME=Y
27 K DIR
28 S DIR(0)="YA"
29 S DIR("A")="Do you want to run the MST synchronization at the same time every day? "
30 S DIR("B")="Y"
31 D ^DIR
32 I $D(DIROUT)!$D(DIRUT) Q
33 I $D(DTOUT)!$D(DUOUT) Q
34 S STIME=$S(Y:"1."_$P(SDTIME,".",2),1:-1)
35 ;
36 ;Put the task into the queue.
37 K ZTSAVE
38 S ZTSAVE("STIME")=STIME
39 S ZTRTN="SYNCH^PXRMMST"
40 S ZTDESC="Clinical Reminders MST synchronization job"
41 S ZTDTH=SDTIME
42 S ZTIO=""
43 D ^%ZTLOAD
44 W !,"Task number ",ZTSK," queued."
45 Q
46 ;
47 ;====================================================
48STATUS(DFN,TEST,DATE,VALUE,TEXT) ;Computed finding for checking a
49 ;patient's MST status.
50 N IEN,TEMP
51 S TEMP=$$GETSTAT^DGMSTAPI(DFN)
52 S IEN=$P(TEMP,U,1)
53 I IEN=-1 D Q
54 . S TEST=0,VALUE="",DATE=$$NOW^PXRMDATE
55 I IEN=0 D Q
56 . S TEST=0
57 . S VALUE=$P(TEMP,U,2)
58 . S DATE=$P(TEMP,U,3)
59 . S TEXT="No MST status found"
60 ;If we get to here then a valid entry was found.
61 S TEST=1
62 S VALUE=$P(TEMP,U,2)
63 S DATE=$P(TEMP,U,3)
64 Q
65 ;
66 ;====================================================
67STCODE(TERM) ;Return the MST status code based on the term name.
68 N STCODE
69 S STCODE=$S(TERM="VA-MST DECLINES REPORT":"D",TERM="VA-MST NEGATIVE REPORT":"N",TERM="VA-MST POSITIVE REPORT":"Y",1:"U")
70 Q STCODE
71 ;
72 ;====================================================
73SYNCH ;Synchronize the MST history file.
74 N INID,LTIME,NUMUPD,START,TEMP
75 ;STIME is passed from QUE via ZTSAVE.
76 D UPDSTAT(.NUMUPD,.START)
77 ;If the initial sync data has been stored then update the daily
78 ;data.
79 S INID=+$P($G(^PXRM(800,1,"MST")),U,1)
80 I INID>0 D
81 . S $P(^PXRM(800,1,"MST"),U,3)=$$NOW^XLFDT
82 . S $P(^PXRM(800,1,"MST"),U,4)=NUMUPD
83 . S $P(^PXRM(800,1,"MST"),U,6)=START
84 E D
85 . S $P(^PXRM(800,1,"MST"),U,1)=$$NOW^XLFDT
86 . S $P(^PXRM(800,1,"MST"),U,2)=NUMUPD
87 . S $P(^PXRM(800,1,"MST"),U,5)=START
88 ;
89 ;Cleanup the task stuff.
90 I STIME=-1 S ZTREQ="@" Q
91 E D
92 . S TEMP=$G(^PXRM(800,1,"MST"))
93 . S LTIME=+$P(TEMP,U,3)
94 . I LTIME=0 S LTIME=+$P(TEMP,U,1)
95 .;Adding STIME sets the new starting time at exactly one day following
96 .;the previous starting time.
97 . S $P(ZTREQ,U,1)=$P(LTIME,".",1)+STIME
98 Q
99 ;
100 ;====================================================
101SYNREP ;Provide a report of the synchronization data.
102 N EDTIME,EITIME,IDATE,LDATE,NIUPD,NLUPD,TEMP
103 S TEMP=$G(^PXRM(800,1,"MST"))
104 S IDATE=$$FMTE^XLFDT($P(TEMP,U,1))
105 I IDATE=0 S IDATE="none"
106 S NIUPD=$P(TEMP,U,2)
107 S EITIME=$$FMDIFF^XLFDT($P(TEMP,U,1),$P(TEMP,U,5),2)
108 S LDATE=$$FMTE^XLFDT($P(TEMP,U,3))
109 I LDATE=0 S LDATE="none"
110 S NLUPD=$P(TEMP,U,4)
111 S EDTIME=$$FMDIFF^XLFDT($P(TEMP,U,3),$P(TEMP,U,6),2)
112 W !!,"Clinical Reminders MST Synchronization Report"
113 W !,"---------------------------------------------"
114 W !,"Initial synchronization date: ",IDATE
115 W !,"Number of updates made: ",NIUPD
116 I EITIME>60 D
117 . S EITIME=$$FMDIFF^XLFDT($P(TEMP,U,1),$P(TEMP,U,5),3)
118 . W !,"Elapsed time: ",EITIME
119 E W !,"Elapsed time: ",EITIME," secs"
120 W !!,"Last daily synchronization date: ",LDATE
121 W !,"Number of updates made: ",NLUPD
122 I EDTIME>60 D
123 . S EDTIME=$$FMDIFF^XLFDT($P(TEMP,U,3),$P(TEMP,U,6),3)
124 . W !,"Elapsed time: ",EDTIME
125 E W !,"Elapsed time: ",EDTIME," secs"
126 Q
127 ;
128 ;====================================================
129UPDATE(DFN,VISIT,SOURCE,STCODE,TYPE) ;Make an update to the MST History file.
130 N DATE,MSTDATE,PROV,STAT,TEMP,UPDSTAT,VPRVIEN
131 S UPDSTAT=-1
132 ;If the update is because of a protocol event use NOW for the
133 ;date/time. If it is being done as part of a synchronization use
134 ;the date the visit was created.
135 S DATE=$S(TYPE="PROTOCOL":$$NOW^XLFDT,1:$P($G(^AUPNVSIT(VISIT,0)),U,2))
136 ;If the date does not contain the time use noon.
137 I DATE'["." S DATE=DATE_".12"
138 S STAT=$$GETSTAT^DGMSTAPI(DFN)
139 S MSTDATE=$S($P(STAT,U,1)>0:$P(STAT,U,3),1:0)
140 I DATE>MSTDATE D
141 .;Determine the provider.
142 . S TEMP=$P(SOURCE,";",2)_$P(SOURCE,";",1)_",12)"
143 . S PROV=$P($G(@TEMP),U,4)
144 . I PROV="" D
145 ..;DBIA #2316
146 .. S VPRVIEN=+$O(^AUPNVPRV("AD",VISIT,""))
147 .. I VPRVIEN>0 S PROV=$P(^AUPNVPRV(VPRVIEN,0),U,1)
148 . S UPDSTAT=$$NEWSTAT^DGMSTAPI(DFN,STCODE,DATE,PROV)
149 . I +UPDSTAT=-1 D
150 .. N FN,GBL,IEN,NAME,TARGET,XMSUB,VADM
151 .. K ^TMP("PXRMXMZ",$J)
152 .. S XMSUB="CLINICAL REMINDER MST UPDATE PROBLEM"
153 .. S ^TMP("PXRMXMZ",$J,1,0)="NEWSTAT^DGMSTAPI returned the following error:"
154 .. S ^TMP("PXRMXMZ",$J,2,0)=$P(UPDSTAT,U,2)
155 .. S ^TMP("PXRMXMZ",$J,3,0)="The following data was passed to NEWSTAT^DGMSTAPI"
156 .. S ^TMP("PXRMXMZ",$J,4,0)="DFN = "_DFN
157 .. S ^TMP("PXRMXMZ",$J,5,0)="Status code = "_STCODE
158 .. S ^TMP("PXRMXMZ",$J,6,0)="Date = "_DATE
159 .. S ^TMP("PXRMXMZ",$J,7,0)="Provider = "_PROV
160 .. S ^TMP("PXRMXMZ",$J,8,0)="Data source = "_SOURCE
161 .. S ^TMP("PXRMXMZ",$J,9,0)="This corresponds to the following:"
162 .. D DEM^VADPT
163 .. S ^TMP("PXRMXMZ",$J,10,0)="Patient = "_VADM(1)
164 .. S ^TMP("PXRMXMZ",$J,11,0)="SSN = "_$P(VADM(2),U,2)
165 .. S ^TMP("PXRMXMZ",$J,12,0)="MST Status = "_$$EXTERNAL^DILFD(29.11,3,"",STCODE)
166 .. S ^TMP("PXRMXMZ",$J,13,0)="Date = "_$$FMTE^XLFDT(DATE,"5Z")
167 .. S TEMP=$S(PROV="":"Unknown",1:TEMP=$$GET1^DIQ(200,PROV,.01,"","",""))
168 .. I TEMP="" S TEMP="Unknown"
169 .. S ^TMP("PXRMXMZ",$J,14,0)="Provider = "_TEMP
170 .. S GBL=$P($P(SOURCE,";",2),"(",1)
171 .. S TEMP=GBL_"(0)"
172 .. S FN=+$P(@TEMP,U,2)
173 .. S TEMP=GBL_"("_$P(SOURCE,";",1)_",0)"
174 .. S TEMP=$G(@TEMP)
175 .. S IEN=$P(TEMP,U,1)
176 .. D FIELD^DID(FN,.01,"N","POINTER","TARGET")
177 .. S GBL="^"_$P(TARGET("POINTER"),"(",1)
178 .. S TEMP=GBL_"(0)"
179 .. S FN=$P(@TEMP,U,1)
180 .. S TEMP=GBL_"("_IEN_",0)"
181 .. S NAME=$P(@TEMP,U,1)
182 .. S ^TMP("PXRMXMZ",$J,14,0)="Data type = "_FN
183 .. S ^TMP("PXRMXMZ",$J,15,0)="Name = "_NAME
184 .. D SEND^PXRMMSG(XMSUB)
185 Q UPDSTAT
186 ;
187 ;====================================================
188UPDPAT(DFN,VISIT,VFL) ;Update the MST history file for a single patient
189 ;using term mappings. Called from DATACHG^PXRMPINF which is invoked
190 ;by the protocol PXK VISIT DATA EVENT.
191 N AFTER,BEFORE,DGBL,SP,STCODE,SIEN,SOURCE
192 N TEMP,TERM,TERMIEN,VF
193 ;Search all the MST terms to build patient lists.
194 F TERM="VA-MST DECLINES REPORT","VA-MST NEGATIVE REPORT","VA-MST POSITIVE REPORT" D
195 . S TERMIEN=$O(^PXRMD(811.5,"B",TERM,""))
196 . S VF=""
197 . F S VF=$O(VFL(VF)) Q:VF="" D
198 .. I VFL(VF)=U Q
199 .. S DGBL=$P(VFL(VF),U,1)
200 .. I '$D(^PXRMD(811.5,TERMIEN,20,"E",DGBL)) Q
201 .. S SIEN=""
202 .. F S SIEN=$O(^TMP("PXKCO",$J,VISIT,VF,SIEN)) Q:SIEN="" D
203 ... S AFTER=$G(^TMP("PXKCO",$J,VISIT,VF,SIEN,0,"AFTER"))
204 ... S BEFORE=$G(^TMP("PXKCO",$J,VISIT,VF,SIEN,0,"BEFORE"))
205 ... I AFTER=BEFORE Q
206 ... S SP=$P(AFTER,U,1)
207 ... I SP="" Q
208 ... I '$D(^PXRMD(811.5,TERMIEN,20,"E",DGBL,SP)) Q
209 ... S SOURCE=SIEN_";^"_$P(VFL(VF),U,2)
210 ...;The status code depends on the term name.
211 ... S STCODE=$$STCODE(TERM)
212 ... S TEMP=$$UPDATE(DFN,VISIT,SOURCE,STCODE,"PROTOCOL")
213 Q
214 ;
215 ;====================================================
216UPDSTAT(NUMUPD,START) ;Update the MST history file using term mappings.
217 N DAS,DATA,DFN,FILENUM,FINDPA,INDEX,ITEM,NOCC,STCODE,SOURCE
218 N TEMP,TERM,TERMARR,TERMIEN,UPDSTAT,VDATE,VISIT
219 S FINDPA=""
220 ;Set the start time for the synchronization.
221 S START=$$NOW^XLFDT
222 S INDEX="PXRM_MST_LIST"
223 S NUMUPD=0
224 ;Search all the MST terms to build patient lists. Only V file data
225 ;is used for the update.
226 F TERM="VA-MST DECLINES REPORT","VA-MST NEGATIVE REPORT","VA-MST POSITIVE REPORT" D
227 . K TERMARR,^TMP($J,INDEX)
228 .;The status code depends on the term name.
229 . S STCODE=$$STCODE(TERM)
230 . S TERMIEN=$O(^PXRMD(811.5,"B",TERM,""))
231 . I TERMIEN="" Q
232 . D TERM^PXRMLDR(TERMIEN,.TERMARR)
233 . D EVALPL^PXRMTERL(.FINDPA,.TERMARR,INDEX)
234 . S DFN=0
235 . F S DFN=+$O(^TMP($J,INDEX,1,DFN)) Q:DFN=0 D
236 .. S ITEM=""
237 .. F S ITEM=$O(^TMP($J,INDEX,1,DFN,ITEM)) Q:ITEM="" D
238 ... S NOCC=0
239 ... F S NOCC=$O(^TMP($J,INDEX,1,DFN,ITEM,NOCC)) Q:NOCC="" D
240 .... S FILENUM=""
241 .... F S FILENUM=$O(^TMP($J,INDEX,1,DFN,ITEM,NOCC,FILENUM)) Q:FILENUM="" D
242 ..... S TEMP=^TMP($J,INDEX,1,DFN,ITEM,NOCC,FILENUM)
243 ..... S DAS=$P(TEMP,U,1)
244 ..... K DATA
245 ..... D GETDATA^PXRMDATA(FILENUM,DAS,.DATA)
246 ..... S VISIT=$G(DATA("VISIT"))
247 ..... I VISIT="" Q
248 ..... S SOURCE=DAS_";"_^PXRMINDX(FILENUM,"GLOBAL NAME")
249 ..... S UPDSTAT=$$UPDATE(DFN,VISIT,SOURCE,STCODE,"SYNCH")
250 ..... I UPDSTAT'=-1 S NUMUPD=NUMUPD+1
251 K ^TMP($J,INDEX)
252 Q
253 ;
Note: See TracBrowser for help on using the repository browser.